Microsoft KB Archive/66052

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

Article ID: 66052

Article Last Modified on 12/12/2003

-

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</li></ul>

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 5.0 Standard Edition</li></ul>

 Microsoft Visual C++ 6.0 Service Pack 5</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q66052

<div class="notice_section">

<div class="summary_section">

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 &quot;c&quot; mode option for the fopen function. When an application opens a file and specifies the &quot;c&quot; mode, the run-time library writes the contents of the file buffer to disk when the application calls the fflush or _flushall function. The &quot;c&quot; 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: kbinfo kbcrt KB66052

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.