2012-05-17 14 views
17
FILE* f = fopen("rajat", "w"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

powodzeniem wraca "A": "someteis A"fseek nie działa, gdy plik jest otwierany w trybie (append)

Ale

FILE* f = fopen("rajat", "a"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

nie działa. Zwraca "sometextis a"

Jakieś pomysły, dlaczego? Jakie jest rozwiązanie tego problemu, aby drugi kod wyprowadzał dokładnie tak, jak pierwszy?

+1

Nie potrzebujesz '" w + "' dla pierwszego? W przeciwnym razie plik zostanie zniszczony i ponownie utworzony. –

Odpowiedz

24

Po otwarciu w trybie dołączania wskaźnik pliku jest zwracany na końcu pliku przed każdym zapisaniem. Możesz zmienić położenie wskaźnika za pomocą fseek, aby odczytać, ale gdy tylko wywołasz funkcję, która zapisuje do pliku, wskaźnik wraca do końca pliku.

Lub, mówiąc inaczej, aby zapobiec utracie danych, pozycja "wskaźnika zapisu" zastępuje pozycję "wskaźnika odczytu". Po każdym dołączeniu wskaźnik zapisu odbija się na nowy EOF.

Odpowiedź w pozycji this link odnosi się do odpowiedniej sekcji standardu C.

Użyj trybu "w+", jeśli chcesz pisać do dowolnych miejsc w pliku. Istniejący plik zostanie nadpisany.

Jeśli chcesz dołączyć do istniejącego pliku początkowo, ale później fseek do dowolnego miejsca, użyj "r+", a następnie fseek(f, 0, SEEK_END).

+0

Jeśli nie chcesz, aby istniejące dane w pliku zostały zniszczone, powinieneś użyć '" r + "', a nie '" w + "'. –

+0

@JamesKanze To prawda, wyjaśniłem ten punkt w edycji kilka minut wstecz. Wadą dla 'r +' jest to, że plik musi istnieć. – dasblinkenlight

+0

Zawsze uważałem, że zachowanie "" a "" nie jest intuicyjne. –