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

Odpowiedz Nowy wątek
2017-01-11 16:49
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

Pozostało 580 znaków

2017-01-11 16:58
1

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

edytowany 1x, ostatnio: spartanPAGE, 2017-01-11 16:58

Pozostało 580 znaków

2017-01-11 17:02
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.

Pozostało 580 znaków

2017-01-11 17:09
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.

edytowany 1x, ostatnio: spartanPAGE, 2017-01-11 17:09

Pozostało 580 znaków

2017-01-11 17:10
0

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

Pozostało 580 znaków

2017-01-11 17:13
0

bo?

Pozostało 580 znaków

2017-01-11 17:20

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?

Pozostało 580 znaków

2017-01-11 17:57
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
*/ 

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler

Pozostało 580 znaków

2017-01-11 18:04
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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