Opróżnianie plików ed fopen () otwartych w trybie aktualizacji, pomiędzy operacjami odczytu i zapisu. Potrzebne jest jawne spłukiwanie?
Przeczytałem o przełączaniu między operacjami odczytu i zapisu (i odwrotnie) dla plików otwartych do aktualizacji przy użyciufopen()
(POŁĄCZYĆ)
„W przypadku plików otwartych do aktualizacji (takich, które zawierają znak„ + ”), na których dozwolone są zarówno operacje wejściowe, jak i wyjściowe, strumień powinien zostać opróżniony (fflush) lub zmieniony (fseek, fsetpos, rewind) między operacją zapisu przez operację odczytu lub operację odczytu, która nie dotarła do końca pliku, po którym następuje operacja zapisu. ”
Są tutaj dwie rzeczy, które chciałbym podkreślić
strumień powinien zostać opróżniony (fflush) lub zmieniony (fseek, fsetpos, rewind)między operacją zapisu a operacją odczytulub operacja odczytu, która nie dotarła do końca pliku, po którym następuje operacja zapisu.1) Jeśli chodzi o pierwszy punkt, czy myjawnie potrzebuję opróżnić między operacją zapisu i odczytu. Mam na myśli, przypuśćmy, że jeśli zamierzamy napisać do nowego pliku, a następnie odczytać go z powrotem. W tym przypadku użyjfseek()
lubrewind()
aby dostać się do początku pliku po zapisaniu ma sens, a jako efekt uboczny będzie opróżnić bufor. Ale chcę wiedzieć, co by się stało, jeśli aktualizujemy / nadpisujemy pierwszą część już istniejący plik z nowymi danymi, ale gdy już to zrobimy, chcemynatychmiast zacznij odczytywać pozostałe, stare dane z tego miejscaCzy musimy użyć czegoś takiegofseek(pFile,0,SEEK_CUR)
tak, że opróżniamy bufor dlawrite-read
przejście, a jednocześnie nie zmienia pozycji wskaźnika pliku? To samo zamieszanie wynika również z drugiego scenariusza, kiedy chcemy przeczytać pierwszą połowę pliku izaraz po tym chcesz tam zacząć pisać. Odpowiedz na to pytanie.
2) Druga część oreading operation which did not reach the end-of-file
zdaje się sugerować, że jeśli operacja odczytu dotrze do końca pliku i zamierzamy później pisać, nie potrzebujemy do tego bufora do opróżnieniaread-write
transition.Możesz to potwierdzić, to znaczy? Tylkowrite-read
przejście wymaga zaczerwienienia, a nieread-write
przejście, zwłaszcza jeśli odczyt osiągnął koniec pliku?