INFO: fflush() & flushall() Do Not Write Data Directly to Disk (66052)
The information in this article applies to:
- The C Run-Time (CRT), when used with:
- Microsoft Visual C++ for Windows, 16-bit edition 1.0
- Microsoft Visual C++ for Windows, 16-bit edition 1.5
- Microsoft Visual C++, 32-bit Editions 1.0
- Microsoft Visual C++, 32-bit Editions 2.0
- Microsoft Visual C++, 32-bit Editions 2.1
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 5.0
- Microsoft Visual C++, 32-bit Editions 6.0
This article was previously published under Q66052 SUMMARY
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.
Modification Type: | Major | Last Reviewed: | 12/12/2003 |
---|
Keywords: | kbCRT kbinfo KB66052 kbAudDeveloper |
---|
|