logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Usuwanie wiersza w pliku tekstowym w C - jak to zrobić?

dzelek 27 Gru 2005 21:39 2122 12
REKLAMA
  • #1 2120848
    dzelek
    Poziom 11  
    Posty: 11
    Jak usunąć wiersz w pliku tekstowym? Chodzi mi o program w języku C który to zrobi. Kombinuje i nie bardzo mi wychodzi.
    main()
    {
    FILE *fp=fopen("baza.txt", "r+");
    fseek(fp, 5, 0);
    fprintf(fp,"\b"); //tutaj jeżeli używam tego \b robi mi z pliku tekstowego blik binarny
    fclose(fp);
    }

    Chce usunąć cały wiersz, ten listening wyżej podejmuje próbę usunięcia tylko jednego znaku. Jednak nie przynosi to sukcesu,prosze o pomoc
  • REKLAMA
  • #2 2121140
    Sam Sung
    Poziom 33  
    Posty: 2039
    Pomógł: 227
    Ocena: 611
    Żeby usunąć fragment pliku, musisz utworzyć nowy i skopiować do niego interesujące Cię części, po czym skasować stary plik.
  • REKLAMA
  • #3 2125711
    dzelek
    Poziom 11  
    Posty: 11
    Ale jesteś pewnien że jest to jedyny możliwy sposób?Robię projekt na zaliczenie z informatyki i nie chce dać plamy, a to rozwiązanie jest... troche naciągane chyba.
  • #4 2125868
    Sam Sung
    Poziom 33  
    Posty: 2039
    Pomógł: 227
    Ocena: 611
    Inne wyjście to kopiowanie znaków zza miejsca do wycięcia na to miejsce, a następnie ucięcie pliku na nowym końcu.
    Jeszcze inne - wczytać cały plik do pamięci i w niej przeprowadzić powyższą operację, po czym zapisać plik. Tego rozwiązania nie polecam, no chyba, że nałożysz ograniczenie na rozmiar pliku ;)
  • #5 2125999
    dzelek
    Poziom 11  
    Posty: 11
    Nie można uczynić czegoś tak prostego jak usunięcie całego wiersza? Nie ma na to jakiegoś sposobu? Programuje w C od niedawna więc jeszcze niewiele wiem, ale mam doświadczenie w pascalu. Skoro da sie wstawić do pliku nowy pusty wiersz to powinno dać się z niego usunąć wiersz. To kopiowanie zawartości w odpowiednie miejsce nie bardzo się sprawdza chyba. To są dane jak w bazie danych, oddzielane znakiem tabulacji. Najlepiej byłoby po prostu wyciąć jeden wiersz.
  • REKLAMA
  • #6 2126300
    JanuszPulit
    Poziom 17  
    Posty: 175
    Pomógł: 14
    Ocena: 4
    Zrób tak jak ci piszą tak czy inaczej musisz plik przepisać od początku omijając tą linie.
  • #7 2126903
    dzelek
    Poziom 11  
    Posty: 11
    O ile jeszcze mogę sobie poradzić ze skopiowaniem tego tekstu w odpowiednie miejsce, to nie wiem jak mam uciać plik w odpowienym miejscu.Może mi ktoś pomóc?
  • #8 2128262
    Sam Sung
    Poziom 33  
    Posty: 2039
    Pomógł: 227
    Ocena: 611
    Nie wiem, w czym konkretnie piszesz, ale poszukaj funkcji truncate albo ftruncate (nagłówek <unistd.h>).
  • #9 2129756
    dzelek
    Poziom 11  
    Posty: 11
    Używam DEV-C++, a pisze w C, nie w C++. Nie ma niestety takiej funkcji jak truncate w moim kompilatorze. Wydaje mi się że w języku C w ogóle nie występuje taka funkcja, przeszukałem internet i kilka książek. Jeszcze jakieś pomysły jak uciąć plik?
  • REKLAMA
  • #10 2129911
    JanuszPulit
    Poziom 17  
    Posty: 175
    Pomógł: 14
    Ocena: 4
    No a devCpp to jest środowisko do kompilatora mingw32 a to jest port gcc i powinien mieć <unistd.h> dostepne. Nie wiem dlaczego ci nie dziala.
  • #11 2130003
    dzelek
    Poziom 11  
    Posty: 11
    Szukałem w helpie i nie ma funkcji o takiej nazwie...Nie chodzi o to że mi nie działa tylko wyskakuje warning że funkcja niezdeklarowana. I deklaruje ten nagłówek który był tu podany. Coś nie bardzo z tą funkcją. Nie wiem skąd ją macie ale nigdzie jej znaleść nie mogę. Zapytałbym o jej parametry ale i tak nie mam jej zdeklarowanej... Nie ma innego sposobu? Przecież blik kończy się jakimś znakiem specjalnym, nie można go wstawić? EOF nie działa... Albo po prostu usunąć określoną ilośc znaków od końca pliku? Jak usunąć te znaki?
  • #12 2130039
    Sam Sung
    Poziom 33  
    Posty: 2039
    Pomógł: 227
    Ocena: 611
    Obcinanie pliku jest funkcją systemu operacyjnego. Pod windowsem użyj funkcji SetEndOfFile z WinAPI.
    Coś kiedyś gdzieś słyszałem :), że zapis do pliku zerowej ilości danych (nie pamiętam, czy przez fwrite, czy write), powoduje jego obcięcie, ale czy i kiedy to działa, nie wiem...
  • #13 2130141
    dzelek
    Poziom 11  
    Posty: 11
    Nie mogę używać WinAPI, program ma być łatwo przenośny na wszystkie platformy bez dodatkowych bilbliotek itp. Z tym pustym wywołaniem fwrite jest problem nie chce tego przyjąć: empty character constant...

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu usunięcia całego wiersza z pliku tekstowego w języku C. Propozycje rozwiązań wskazują, że bezpośrednia modyfikacja pliku w miejscu usunięcia jest trudna lub niemożliwa. Najczęściej zalecanym podejściem jest utworzenie nowego pliku, do którego kopiowane są wszystkie linie poza tą, którą chcemy usunąć, a następnie zastąpienie oryginalnego pliku nowym. Alternatywnie można wczytać cały plik do pamięci, usunąć linię i zapisać plik ponownie, co jednak jest niezalecane dla dużych plików. Próby użycia funkcji systemowych do obcinania pliku, takich jak truncate lub ftruncate, napotykają na problemy z dostępnością i przenośnością, zwłaszcza w środowisku Dev-C++ z kompilatorem MinGW. Pod Windows sugerowano użycie funkcji SetEndOfFile z WinAPI, ale autor potrzebuje rozwiązania przenośnego, bez zależności od specyficznych bibliotek systemowych. Próby manipulacji plikiem przez zapisywanie znaków specjalnych (np. backspace) nie przynoszą efektu. Podsumowując, jedyną praktyczną i przenośną metodą jest przepisywanie pliku pomijając wybrany wiersz.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA