输出文件流成员函数

输出流成员函数具有三种类型:等效于操控器的类型、执行未格式化的写操作的类型,以及其他修改流状态且不具有等效的操控器或插入运算符的类型。 对于连续的格式化输出,可仅使用插入运算符和操控器。 对于随机访问二进制磁盘输出,在无论是否具有插入运算符,都可使用其他成员函数。

输出流的 open 函数

若要使用输出文件流 (ofstream),则必须将该流与构造函数或 open 函数中的特定磁盘文件相关联。 如果使用 open 函数,则可以重复使用具有一系列文件的同一流对象。 在任一情况下,描述该文件的参数是相同的。

当打开与输出流关联的文件时,通常会指定 open_mode 标志。 可以将在 ios 类中定义为枚举器的这些标志与按位 OR (|) 运算符合并。 有关枚举器的列表,请参阅 ios_base::openmode

三种常见的输出流情况涉及模式选项:

  • 创建文件。 如果该文件已存在,将删除旧版本。

    ofstream ofile("FILENAME");
    // Default is ios::out
    
    ofstream ofile("FILENAME", ios::out);
    // Equivalent to above
    
  • 将记录追加到现有文件或者创建一个文件(如果不存在)。

    ofstream ofile("FILENAME", ios::app);
    
  • 在同一个流中打开两个文件,一次打开一个。

    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.
    

put 函数

put 函数将一个字符写入到输出流。 默认情况下,以下两个语句相同,但第二个受流的格式化参数的影响:

cout.put('A');

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

write 函数

write 函数将内存块写入到输出文件流。 长度参数指定写入的字节数。 此示例可创建输出文件流,并向其写入 Date 结构的二进制值:

// 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 );
}

write 函数到达 NULL 字符时不会停止,因此将写入完整的类结构。 该函数采用两个参数:一个 char 指针和一个要写入的字符计数。 在对结构对象寻址之前,请注意需要强制转换为 char *

seekp 和 tellp 函数

输出文件流保留指向下一次写入数据的位置的内部指针。 seekp 成员函数将设置此指针,从而提供随机访问磁盘文件输出。 tellp 成员函数将返回文件位置。 有关使用与 seekptellp 等效的输入流的示例,请参阅 seekgtellg 函数

输出流的 close 函数

close 成员函数将关闭与输出文件流关联的磁盘文件。 若要完成所有磁盘输出,则必须关闭该文件。 如有必要,ofstream 析构函数将关闭该文件,但如果需要打开相同流对象的另一个文件,则可以使用 close 函数。

仅当构造函数或 open 成员函数打开该文件时,输出流析构函数才会自动关闭流的文件。 如果向构造函数传递已打开文件的文件描述符,或使用 attach 成员函数,则必须显式关闭该文件。

错误处理函数

使用这些成员函数来测试写入流时是否出现错误:

函数 返回值
bad 如果存在不可恢复的错误,则返回 true
fail 如果出现不可恢复的错误或“预期”条件(例如转换错误),或者如果找不到该文件,则返回 true。 在使用填零参数调用 clear 后,通常可以恢复处理。
good 如果没有任何错误条件(不可恢复的或其他的条件),且未设置文件结束标志,则返回 true
eof 在文件结尾时返回 true
clear 设置内部错误状态。 如果通过默认参数调用,则它会清除所有错误位。
[rdstate](basic-ios-class.md#rdstate 返回当前错误状态。

重载 ! 运算符以执行与 fail 函数相同的函数。 因此表达式:

if(!cout)...

等效于:

if(cout.fail())...

void*() 运算符重载为与 ! 运算符相反;因此表达式:

if(cout)...

等效于:

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

void*() 运算符并不等同于 good,因为它不会测试文件结尾。

另请参阅

输出流