C++ ofstream 类

定义和用法

ofstream 类(是 "output file stream"(输出文件流)的缩写)用于向文件中写入数据。

ofstream 类在 <fstream> 头文件中定义。

要打开一个文件,只需将文件路径传递给构造函数:

ofstream MyFile("filename.txt");

可以使用 << 插入运算符以及多种函数向文件中写入数据。

实例

使用 ofstream 向文件写入数据:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
  // 创建并打开一个文本文件
  ofstream MyFile("filename.txt");

  // 向文件中写入数据
  MyFile << "操作文件可能有些棘手,但也很有趣!";

  // 关闭文件
  MyFile.close();
}

插入运算符

<< 插入运算符将字面值或变量的内容写入文件。

int year = 2024;
MyFile << year << "\n";
MyFile << "操作文件可能有些棘手,但也很有趣!";

格式控制符

格式控制符用于更改写入文件的数据格式。它们与 << 插入运算符一起使用,方式与字面值和变量相同。

除了 setw() 之外,格式控制符的效果会一直持续,直到被另一个格式控制符更改。

下表列出了一些有用的格式控制符:

格式控制符 描述 示例
boolalpha 将布尔值以 "true" 和 "false" 的形式写入,而不是 "1" 和 "0"。 MyFile << boolalpha << false;
dec 以十进制数字表示整数。 MyFile << dec << 12;
endl 写入换行符。此格式控制符还会刷新输出缓冲区,因此效率低于打印 \n MyFile << "Line 1" << endl << "Line 2";
ends 写入用于结束 C 风格字符串的 \0 空终止符。 MyFile << "Hello World!" << ends;
fixed 以固定的小数位数表示浮点数。小数位数可通过 setprecision() 格式控制符设置。 MyFile << fixed << 19.99;
hex 以十六进制数字表示整数。 MyFile << hex << 12;
internal 如果指定了宽度(使用 setw() 格式控制符),数字的符号将左对齐,而数值右对齐,其他数据类型将右对齐输出。 MyFile << setw(10) << internal << -12345;
left 如果指定了宽度(使用 setw() 格式控制符),将输出左对齐。 MyFile << setw(10) << left << "Hello";
noboolalpha 用于重置 boolalpha 格式控制符所做的更改。 MyFile << noboolalpha << false;
noshowbase 用于重置 showbase 格式控制符所做的更改。 MyFile << hex << noshowbase << 12;
noshowpoint 用于重置 showpoint 格式控制符所做的更改。 MyFile << noshowpoint << 12345.0;
noshowpos 用于重置 showpos 格式控制符所做的更改。 MyFile << noshowpos << 12;
nouppercase 用于重置 uppercase 格式控制符所做的更改。 MyFile << hex << nouppercase << 12;
oct 以八进制数字表示整数。 MyFile << oct << 12;
right 如果指定了宽度(使用 setw() 格式控制符),将输出右对齐。 MyFile << setw(10) << right << "Hello";
scientific 以科学计数法表示浮点数。小数位数可通过 setprecision() 格式控制符设置。 MyFile << fixed << 19.99;
setfill()

选择用于填充的字符。

需要包含 <iomanip> 库。

MyFile << setfill('.') << setw(10) << 19.99;
setprecision()

设置浮点数的精度。如果使用了 fixedscientific 格式控制符,则指定小数位数,否则指定有效数字位数。

需要包含 <iomanip> 库。

MyFile << setprecision(4) << 12.3456;
setw()

指定下一个输出的最小字符宽度。如果输出不够宽,则添加填充字符以填满剩余空间。

需要包含 <iomanip> 库。

MyFile << setw(10) << "Hello";
showbase 在以十六进制或八进制表示整数时,在数字前加上 "0x" 或 "0" 以显示其基数。 MyFile << hex << showbase << 12;
showpoint 即使不需要,也总是为浮点数写入小数点。 MyFile << showpoint << 12345.0;
showpos 总是为正数写入 + 符号。 MyFile << showpos << 12;
uppercase 以大写字母表示十六进制数字和科学计数法中的 "e"。 MyFile << hex << uppercase << 12;

文件写入函数

文件写入函数将数据写入文件,并将文件指针移动到写入内容后的第一个位置。

write()

write(str, n) 方法将 char 数组 str 中的 n 个字符写入文件。

char myStr[] = "Hello World!";
MyFile.write(myStr, 5);

put()

put(c) 方法将指定的字符 c 写入文件。

char grade = 'B';
MyFile.put(grade);

文件处理函数

文件处理函数用于打开、关闭和浏览文件。

open()

open(filepath) 方法打开 filepath 指定的路径下的文件。如果文件已经打开,则此方法无效果。

ofstream MyFile;
MyFile.open("filename.txt");

is_open()

is_open() 方法在文件打开时返回 true,在没有文件打开时返回 false。

ofstream MyFile;
cout << MyFile.is_open(); << "\n"; // 输出 0,因为文件未打开
MyFile.open("filename.txt");
cout << MyFile.is_open(); << "\n"; // 输出 1,因为文件已打开

close()

close() 方法关闭文件。完成文件操作后关闭文件以释放资源是一个好习惯。

MyFile.close();

rdbuf()

rdbuf() 方法返回指向内部 filebuf 对象的指针,该对象直接处理文件。

filebuf * buf = MyFile.rdbuf();

seekp()

seekp(position) 方法将文件指针移动到相对于文件开头指定的位置。

MyFile.seekp(6)

seekp(position, origin) 方法将文件指针移动到相对于指定原点的文件中的某个位置。origin 有以下三种可能值:

  • ofstream::beg - 位置相对于文件开头。
  • ofstream::cur - 位置相对于当前文件位置。
  • ofstream::end - 位置相对于文件末尾。

将文件指针移动到不同位置:

MyFile.seekp(6, ofstream::beg);
cout << MyFile.tellp(); << "\n";
MyFile.seekp(-3, ofstream::cur);
cout << MyFile.tellp(); << "\n";
MyFile.seekp(-4, ofstream::end);
cout << MyFile.tellp(); << "\n";

tellp()

tellp() 方法返回文件指针在文件中的当前位置。

cout << MyFile.tellp();