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

Last reviewed: September 4, 1997
Article ID: Q66052

The information in this article applies to:
  • The C Run-time (CRT) included with: - Microsoft C for MS-DOS, versions 6.0, 6.0a, 6.0ax - Microsoft C/C++ for MS-DOS, version 7.0 - Microsoft Visual C++ for Windows, versions 1.0, 1.5 - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, 4.0, 5.0

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.

MORE INFORMATION

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.

Keywords          : CRTIss kbfasttip
Version           : MS-DOS:6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.00a; WINDOWS  NT:1.0,2.0,2.1,4.0,5.0
Platform          : MS-DOS NT WINDOWS
Issue type        : kbinfo


================================================================================


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 4, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.