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

Article translations Article translations
Article ID: 66052 - View products that this article applies to.
This article was previously published under Q66052
Expand all | Collapse all

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.

Properties

Article ID: 66052 - Last Review: December 12, 2003 - Revision: 3.0
APPLIES TO
  • The C Run-Time (CRT), when used with:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
Keywords: 
kbcrt kbinfo KB66052
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com