[C] Usuwanie podanej przez użytkownika linii w pliku.

0

Witam,
Mam do napisania program, który obsługuje parking. Pozwolę sobie napisać tutaj treść, aby dokładnie opisać z czym mam problem... Polecenie w skrócie:

Program obsługujący parking.
Plik "stan.txt" zawiera aktualny stan parkingu, czyli numery rejestracyjne zaparkowanych pojazdów.
Plik "raport.txt" zawiera raporty przyjazdu oraz odjazdu z parkingu, czyli:

  1. W przypadku przyjazdu:
    -Numery rejestracyjne pojazdu,
    -Date przyjazdu,
    -Godzinę przyjazdu;

  2. W przypadku odjazdu:
    -Numer pojazdu (wybrany z listy),
    -Date odjazdu,
    -Godzinę odjazdu;

Całość obsługiwane przez menu.

Mam problem, po wybraniu drugiej opcji z menu, czyli odjazdu. Po wybraniu jej, podajemy numer pojazdu, datę oraz godzinę te dane mają zostać wpisane do pliku z raportami (to działa) i usunąć numery rejestracyjne tego pojazdu z pliku ze stanem parkingu. Właśnie z tą drugą częścią mam problem.

Kod wrzuciłem na Pastebina, żeby nie przerażać was długością tego posta bo i tak już jest długi :D
Kod źródłowy

Liczę na Waszą pomoc jak to rozwiązać...
Pozdrawiam

1

wersja leniwa: przekopiuj wszystko poza tym co jest do usunięcia do nowego pliku, usuń nieaktualny plik, nazwij poprawnie nowy.

0

Jest to jakieś rozwiązanie, spróbuję to tak zrobić. A czy ktoś ma może inny pomysł jak to przekopiować bez tworzenia nowego pliku? Będę wdzięczny za takie rozwiązanie.

0

Wczytaj wszystko do pamięci, wywal czego nie chcesz, zapisz.

Ewentualnie, mógłbyś się bawić w jakieś przesuwanie wskaźnika po pliku, lokalizowaniu tego co chcesz wywalić i jakieś inne nudne niewarte zachodu rzeczy.

0

Właśnie, tylko żeby wczytać wszystko do pamięci musiałbym stworzyć tablicę a nie mogę tego zrobić :P

0

bo?

0

To było zadanie na wczorajszym laboratorium z programowania. Co prawda mam to zaliczone, ale chciałbym sobie to dopisać do końca w domu.
Prowadzący nie chciał, aby te zadanie było robione na tablicach, nie wiem dlaczego.

Btw. zrobiłem tak jak napisałeś, lecz program ani nie usuwa tej linii, ani nie zmienia nazwy pliku...

 if(condition)
						{
							while(!feof(condition))
							{
								if((num-1)!=i)
								{
									if( fscanf(condition, "%s", &buffer) != 1) break;
									fprintf(newCondition, "%s \n", buffer);
									++i;
								}
								else if((num-1)==i)
								{
									++i;
									continue;
								}
								
							}

Czy rename("stan2.txt", "stan.txt") jest funkcją zmieniającą nazwę pliku, albo robię to źle?

1

Diabeł siedzi w odpowiednim otworzeniu plików.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // Dla MS Win nie ma tego nagłówka, patrz uwaga o SetEndOfFile()
#include <string.h>

int main() {
    char pattern[] = "300\n";
    const char file_name[] = "data.txt";
    ssize_t line_count;
    size_t len = 0;
    char * line = NULL;

    FILE * reader = fopen(file_name, "rb");
    FILE * writer = fopen(file_name, "r+b");

    if((reader == NULL) || (writer == NULL)) {
        perror("Open file error");
        exit(EXIT_FAILURE);
    }

    while((line_count = getline(&line, &len, reader)) != -1) {
        if(strcmp(line, pattern)) {
            fputs(line, writer);
        }
    }
    long position = ftell(writer);
    /* Dla MS Win masz SetEndOfFile() */
    ftruncate(fileno(writer), position);

    return EXIT_FAILURE;
}
/* W pliku data.txt znajdują się...
100
200
400
500
*/ 
0

@Mokrowski:

Pewnie masz racje, ale ja niestety mało z tego rozumiem :P Jestem zbyt świeży, żeby to zrozumieć.. Ale plusa dam, może komuś się przyda :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1