2017-09-11 64 views
18

Czy ktoś mógłby mi powiedzieć, dlaczego plik się nie zmienia? Działa, gdy używam rewind lub fseek, ale nie inaczej.Zapisywanie w pliku za pomocą fputs w C

Co znajduje się w standardowy sposób przy użyciu fputs po fgets. Wskaźnik pliku znajduje się na pozycji 9, więc fputs musi później pisać, ale nic nie robi.

W pliku:

abcd efgh ijkl mnor 

w kodzie źródłowym:

char c; 
char str[15]; 

FILE *fp = fopen("d:\\data.txt","r+"); 

fgets(str, 10, fp); 

// fseek(fp, 9, SEEK_SET); 
// rewind(fp); 

printf("%d\n", ftell(fp)); 
// ftel shows that it's in "9". 

printf("%s", str); 

fputs(str, fp); 
// why its not working 

fclose(fp); 
+10

Kiedy i gdzie i jak można sprawdzić wyjście? Między wywołaniami 'fputs' i' fclose'? Być może powinieneś "przepłukać" bufory plików? –

+1

Załóżmy, że plik, który został otwarty do odczytu i aktualizacji, zawiera dwa wiersze tekstu. Czytasz pierwszy wiersz, a następnie zapisujesz go w tym samym pliku. Jak myślisz, gdzie to zostanie napisane?Czy widzisz potrzebę wyraźnego ustawienia wskaźnika pliku po przeczytaniu, przed napisaniem? –

+0

do edycji z bieżącej lokalizacji użyj 'fseek (fp, 0L, SEEK_CUR);' – krpra

Odpowiedz

25

Odnośnie definicji fopen/'+' w standardzie C (na przykład jak w this online C standard draft), przełączenie z odczytu do pisania, wymaga pośrednich wywołanie funkcji położenia plików (nacisk są min):

7,21 .5.3 funkcja fopen

(7) Gdy plik jest otwarty w trybie aktualizacji („+” jako drugi lub trzeci postać w powyższym wykazie wartości argumentu mode), oba wejścia i dane wyjściowe mogą być wykonywane na powiązanym strumieniu. Jednakże wyjście nie są bezpośrednio następuje wejście bez przerywania rozmowy do funkcja fflush lub funkcji położenia pliku (fseek fsetpos, lub do tyłu) i wejścia nie są bezpośrednio następuje wyjście bez z interweniujące wywołanie funkcji pozycjonowania pliku, chyba że operacja wejścia napotka koniec pliku. Otwieranie (lub tworzenie) pliku tekstowego w trybie aktualizacji może zamiast tego otworzyć (lub utworzyć) strumień binarny w niektórych implementacjach .

Więc sugeruję napisać następujący kod do przezwyciężenia problemu:

fseek (fp , 0, SEEK_CUR); 
fputs(str, fp); 
7

MS documentation dla fopen mówi tak:

Gdy typ "r+", "w+" lub "a+" dostępu jest określony zarówno odczyt, jak i zapis g są włączone (plik ma być otwarty na "aktualizacja"). Jednak po przejściu z czytania do zapisu operacja wejścia musi napotkać znacznik EOF. Jeśli nie ma numeru EOF, użytkownik musi użyć wywołania interweniującego do funkcji pozycjonowania pliku. Funkcje pozycjonowania pliku są następujące: fsetpos, fseek i rewind. Po przejściu z trybu czytania do odczytu należy użyć wywołania interweniującego pod numer albo fflush lub funkcji pozycjonowania pliku.