Wskazówka - usuwanie wiersza w pliku tekstowym

0

Witam,
Posiadam program, który na chwilę obecną zapisuje(dodaje do końca) nowe rekordy / odczytuje / wypisuje dane z/do pliku tekstowego.
Staram się rozwijać go coraz bardziej - w tym celu chciałbym dodać usuwanie rekordu wybranego przez użytkownika.
Zapis w pliku wygląda następująco ( _ = spacja)
ID_MODEL_MARKA_CENA_PRZEBIEG (\n) - jest to struktura
Wszystko było by banalne gdybym posiadał tylko dane (string) przy czym 1 string = 1 wiersz. Mógłbym wtedy skorzystać z biblioteki string.h i funkcji strcmp/fgets/fputs lub ew strcpy do ,,zerowania"

Wiem że w C nie da się usunąć bezpośrednio wiersza ze środka pliku. Najpierw należny wczytać dane z pliku dokonać usunięcia -> zapisać w innym pliku -> usunąć pierwotny -> przemianować kopie.

Oczywiście to nie problem wczytać wszystkie dane linijka po linijce jako pojedyncze znaki tylko jak później odnaleźć szukany rekord?
W tym monecie się gubię i przydałyby mi się jakieś wskazówki/ pomysły (Podkreślam ze nie chce żadnego kodu interesuje mnie podpowiedz z jakich bibliotek/funkcji powinienem skorzystać/ na co zwrócić uwagę).

2

A masz już funkcje która wyświetla pierwszy z brzegu rekord z pliku?
Jeżeli nie masz to zacznij od tego.
Jeżeli masz to użyj jej do odczytu kolejnego rekordu, po czym dołącz istniejącą już zapis do pliku (tylko że do innego).
Teraz jak to co w linijce wyżej dasz w pętle do EOF pliku oraz przed zapisem sprawdzisz czy rekord odpowiada kryteriom usuwania to pomijasz zapis.

0

Posiadam coś takiego (większość zaczerpnięta z manuali).
program skanuje plik aby odczytać jego rozmiar , alokuje pamięć , przepisuje zawartość do bufora. Teraz myślałem żeby użytkownik podał ID rekordu który chce usunąć i poprzez strstr odnaleźć początek szukanego rekordu(x). Następnie zapisz od 0 elementu do x oraz od x+ilość elementów w wierszu do końca bufora. Idea chyba nie jest taka zła(strstr to słabe ogniwo gdyż wyszukuje 1 hasło = id musi być unikatowe).
Problem w rozpoznaniu ilości elementów w usuwanym wierszu. Najlepiej gdyby był on stalą wartością w moim przypadku(nie tym poniżej) każdy wiersz to 1 rekord struktury
id[max] marka[max1] model[max2] cena [max3] przebieg[max4] <- każde pole ma ustalony max rozmiar. Tylko co z tego jeżeli np do marki wpisze "a" to będzie długości 1 znaku musiałoby jakoś automatycznie uzupełniać spacjami do MAX wielkości.

Inny pomysł to od wartości X zacząć wyszukiwać znaku końca Lini \n\r (jakiś y)- w tym przypadku mam dany początek i koniec wiersza = zapisz od 0 do x i od y do końca bufora.

_13th_Dragon napisał(a):

A masz już funkcje która wyświetla pierwszy z brzegu rekord z pliku?

Pierwszy/ostatni to żaden problem od 0 do znaku końca Lini, tylko jak to zastosować do 2,3,4 etc linijek ;/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE * pFile;
    long lSize;
    char * buffer, *s; 
    size_t result;
    int i,x ;
    pFile = fopen ( "slownik.txt" , "rb" ); // otwarcie przykladowego pliku 
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

// odczyt rozmiaru pliku
    fseek (pFile , 0 , SEEK_END); //ustawienie pozycji w pliku pfile na pozycji poczatkowej az do konca(SEEK_END)
    lSize = ftell (pFile); //ftell mowi gdzie dokladnie jest wskaznik pliku
    rewind (pFile);

// rezerwowanie pamieci dla calego pliku
    buffer = (char*) malloc (sizeof(char)*lSize); // rezerwowanie pamieci // jedyna linijka ktorej nie rozumiem
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

// copy the file into the buffer:
    result = fread (buffer,1,lSize,pFile);
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
 
// caly plik znajduje sie w bufforze w postaci ciagu znakow enter = 2 znaki \n\r
    s = strstr(buffer, "ID");      // znajduje ,,id'' rekordu
    if (s != NULL)                     
    {
        x = s - buffer;
        printf("Found string at index = %d\n",x); //wypisanie pozycji gdzie rozpoczyna sie x 
    } 
 
  fclose (pFile);
  free (buffer);
  return 0;
}
0

,,Pomysł beznadziejny. - _13th_Dragon " - Tak wiec posłuchałem twojej rady jeszcze raz, pomyślałem , spojrzałem na swój kod i mnie olśniło jakie to proste ! Wszystko już działa. Dziękuje za naprowadzenie :)

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