Output File Stream Member Functions

Output stream member functions have three types: those that are equivalent to manipulators, those that perform unformatted write operations, and those that otherwise modify the stream state and have no equivalent manipulator or insertion operator. For sequential, formatted output, you might use only insertion operators and manipulators. For random-access binary disk output, you use other member functions, with or without insertion operators.

The open Function for Output Streams

To use an output file stream (ofstream), you must associate that stream with a specific disk file in the constructor or the open function. If you use the open function, you can reuse the same stream object with a series of files. In either case, the arguments describing the file are the same.

When you open the file associated with an output stream, you generally specify an open_mode flag. You can combine these flags, which are defined as enumerators in the ios class, with the bitwise OR ( | ) operator. See ios_base::openmode for a list of the enumerators.

Three common output stream situations involve mode options:

  • Creating a file. If the file already exists, the old version is deleted.

    ofstream ofile("FILENAME");
    // Default is ios::out
    
    ofstream ofile("FILENAME", ios::out);
    // Equivalent to above
    
  • Appending records to an existing file or creating one if it doesn't exist.

    ofstream ofile("FILENAME", ios::app);
    
  • Opening two files, one at a time, on the same stream.

    ofstream ofile();
    ofile.open("FILE1", ios::in);
    // Do some output
    ofile.close();    // FILE1 closed
    ofile.open("FILE2", ios::in);
    // Do some more output
    ofile.close();    // FILE2 closed
    // When ofile goes out of scope it is destroyed.
    

The put function

The put function writes one character to the output stream. The following two statements are the same by default, but the second is affected by the stream's format arguments:

cout.put('A');

// Exactly one character written
cout <<'A'; // Format arguments 'width' and 'fill' apply

The write function

The write function writes a block of memory to an output file stream. The length argument specifies the number of bytes written. This example creates an output file stream and writes the binary value of the Date structure to it:

// write_function.cpp
// compile with: /EHsc
#include <fstream>
using namespace std;

struct Date
{
   int mo, da, yr;
};

int main( )
{
   Date dt = { 6, 10, 92 };
   ofstream tfile( "date.dat" , ios::binary );
   tfile.write( (char *) &dt, sizeof dt );
}

The write function doesn't stop when it reaches a NULL character, so the complete class structure is written. The function takes two arguments: a char pointer and a count of characters to write. Note the required cast to char * before the address of the structure object.

The seekp and tellp Functions

An output file stream keeps an internal pointer that points to the position where data is to be written next. The seekp member function sets this pointer and thus provides random-access disk file output. The tellp member function returns the file position. For examples that use the input stream equivalents to seekp and tellp, see The seekg and tellg Functions.

The close Function for Output Streams

The close member function closes the disk file associated with an output file stream. The file must be closed to complete all disk output. If necessary, the ofstream destructor closes the file for you, but you can use the close function if you need to open another file for the same stream object.

The output stream destructor automatically closes a stream's file only if the constructor or the open member function opened the file. If you pass the constructor a file descriptor for an already-open file or use the attach member function, you must close the file explicitly.

Error Processing Functions

Use these member functions to test for errors while writing to a stream:

Function Return value
bad Returns true if there's an unrecoverable error.
fail Returns true if there's an unrecoverable error or an "expected" condition, such as a conversion error, or if the file isn't found. Processing can often resume after a call to clear with a zero argument.
good Returns true if there's no error condition (unrecoverable or otherwise) and the end-of-file flag isn't set.
eof Returns true on the end-of-file condition.
clear Sets the internal error state. If called with the default arguments, it clears all error bits.
[rdstate](basic-ios-class.md#rdstate Returns the current error state.

The ! operator is overloaded to perform the same function as the fail function. Thus the expression:

if(!cout)...

is equivalent to:

if(cout.fail())...

The void*() operator is overloaded to be the opposite of the ! operator; thus the expression:

if(cout)...

is equal to:

if(!cout.fail())...

The void*() operator isn't equivalent to good because it doesn't test for the end of file.

See also

Output Streams