2013-04-23 35 views
9

Mam dobry stary deskryptor pliku PL FILE pod Windows, który jest używany przez strumień wyjściowy do zapisu danych. Moje pytanie jest proste, ale nie mogłem znaleźć odpowiedzi:Kiedy opróżnione są PLIK?

Kiedy zawartość jest spłukiwana na dysk przy założeniu, że nie dzwonię do fflush?

Strumień stale otrzymuje dane i wydaje się, że zawartość jest często spłukiwana, ale jaka jest zasada, aby ją spłukać?

+3

To na pewno zależy od systemu operacyjnego. – Phonon

+0

BTW faktycznie kod używa wxTextOutputStream, który używa wxFFileOutoutStream, który używa wxFFile. Ale to tylko enkapsuluje strukturę PLIKU, więc domyślam się, że mechanizm fflush jest tutaj interesujący ... – anhoppe

+1

Jeśli jest buforowany, to jest przepłukiwany, gdy bufor jest pełny. I nie bardzo rozumiem, co masz na myśli przez strukturę PLIKU (fopen , fwrite, ...) –

Odpowiedz

13

Jeśli realizacja biblioteka może określić strumień wyjściowy nie odnieść się do interaktywnego urządzenia (i tylko wtedy), strumień będzie w pełni buforowane, to znaczy będą kasowane gdy bufor (domyślnie z BUFSIZ rozmiaru) jest pełna.

Jeśli nie w pełni buforowane, strumień może być linia buforowane, to zostanie ona zaczerwieniona gdy '\n' jest napisane (lub bufor jest pełny, jeśli linia jest naprawdę długo) lub niebuforowana.

(ISO/IEC 9899: 1999, rozdział 7.19.5.3 "Funkcja fopen()", pkt 7. Nie masz nowszą wersję standardu pod ręką, ale AFAIK ten nie uległ zmianie.)

To, co stanowi "urządzenie interaktywne", jest definiowane przez implementację. (Rozdział 5.1.2.3 "Realizacja programu", paragraf 6.)

Ogólna zasada mówi, że wyjście pliku powinno być w pełni zbuforowane, a wyjściowe wyjście buforowane liniowo (lub niebuforowane, jak słusznie zauważył Jesse Good).

Zarówno zasady buforowania, jak i rozmiar bufora można zmienić za pomocą setvbuf(). Zauważ, że każda taka zmiana musi nastąpić przed możesz zacząć uzyskiwać dostęp do strumienia, co jest nieco oczywiste, gdy się nad tym zastanowisz.

+0

Człowieku, to dobra odpowiedź, dziękuję – anhoppe

+1

@anhoppe: W rzeczywistości * zaimplementowałem * '' i * chłopiec * lepiej naucz się czytać drobną czcionkę, gdy robisz to ... :-D – DevSolar

+0

+1 Dodatkowo, standard [C11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) określa, że ​​'BUFSIZ' powinno być _at least_ 256. –