INFO: fflush() & flushall() Do Not Write Data Directly to Disk

만료된 KB 콘텐츠 고지 사항

이 문서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 작성되었습니다. 따라서 이 문서는 “있는 그대로" 제공되며 더 이상 업데이트되지 않습니다.


The fflush() and flushall() functions in the C run-time library do not write file changes directly to disk. These functions flush the file buffers provided by the library; they do not flush the buffers the MS-DOS, OS/2, or Windows NT operating systems provide at the system level. For example, if an application calls fflush() but MS-DOS does not write its buffers to disk before a system crash (or equivalent event), information may still be lost. To address this situation in MS-DOS, use the _commit() function after you call fflush() or fflushall(). Calling _commit() causes the operating system to flush to disk the buffer associated with a file handle.

The OS/2 operating system provides two separate functions, depending on the installed version of OS/2. In 16-bit OS/2 (versions 1.x), use the DosBufReset() function. In 32-bit OS/2 (version 2.0), use the DosResetBuffer() function.

The Windows NT operating system provides the WIN32 API FlushFileBuffers(). The _commit() function included with the Visual C++ 32-bit Edition CRT calls FlushFileBuffers to write buffered data to disk.

Microsoft C/C++ version 7.0 introduces the "c" mode option for the fopen() function. When an application opens a file and specifies the "c" mode, the run-time library writes the contents of the file buffer to disk when the application calls the fflush() or _flushall() function. The "c" mode option is a Microsoft extension and is not part of the ANSI standard for fopen().

To change the default behavior of the fflush() and _flushall() functions, link your application with the COMMODE.OBJ file provided by the products listed at the beginning of this article. COMMODE.OBJ changes the global commit flag such that calling fflush() or _flushall() commits the file buffer to disk. This flag tells fflush() to call _commit() to flush the low- level file when the stream is flushed and _commit() in turn calls _dos_commit() for the MS-DOS level file. By default flushing a stream does not flush the low-level and MS-DOS level files.


문서 ID: 66052 - 마지막 검토: 2003. 12. 12. - 수정: 1