C++如何读取和写入文件?(fstream用法详解)

使用fstream读写文件需按需求选择流类型:ifstream只读、ofstream只写、fstream读写兼备;打开后像cin/cout操作,务必检查is_open()并及时close()。

fstream 读写文件,核心是选对流类型(ifstreamofstreamfstream),打开文件后像操作 cin/cout 一样处理数据,最后记得关闭。

打开文件前:选对流类型

不是所有情况都用 fstream。按需求选更清晰、更安全:

  • ifstream:只读文件,自动设为 ios::in 模式
  • ofstream:只写文件,自动设为 ios::out 模式(默认会清空原内容)
  • fstream:读写兼备,需手动指定模式,比如 ios::in | ios::out

头文件统一包含 ,不用额外加 iostream>(但若用到 cout/cin 仍需)。

打开文件:推荐用构造函数或 open(),别忽略失败检查

两种常用方式,效果等价,但构造函数更简洁:

  • 构造时打开:std::ifstream fin("data.txt");
  • 先定义再打开:std::ofstream fout; fout.open("output.txt");

无论哪种,打开后务必检查是否成功:

if (!fin.is_open()) {
    std::cerr << "无法打开输入文件\n";
    return 1;
}

注意:is_open()fail()good() 更直接,专用于判断“是否已成功关联文件”。

读取文件:按行、按词、按字节,各用各的函数

根据数据格式灵活选择:

  • 整行读取(含空格,推荐处理文本):std::string line; while (std::getline(fin, line)) { ... }
  • 按空白分隔读单词(跳过空格/换行):std::string word; while (fin >> word) { ... }
  • 读单个字符:char c; while (fin.get(c)) { ... }get() 不跳过空白)
  • 读固定长度数据(如二进制):fin.read(buffer, size);

注意:用 >> 读数字时,遇到非数字字符会停止并置 flag 为 failbit;后续需调用 clear() 并跳过非法字符才能继续。

写入文件:和 cout 几乎一样,但要注意缓冲区刷新

写法和 std::cout 完全一致:

  • 输出字符串、数字、变量:fout
  • 格式控制(如宽度、精度):fout (需
  • 写入二进制:fout.write(buffer, size);(配合 ios::binary 模式)

写完不关文件或不刷新,数据可能还卡在缓冲区里。显式调用 flush()close() 才真正落盘。用 RAII(对象析构自动关闭)最省心:std::ofstream fout("a.txt"); 离开作用域就自动关闭。

基本上就这些。关键不是记多少函数,而是理解“流对象 = 文件句柄 + 缓冲区 + 状态标志”,读写逻辑和控制台一致,只是目标换成了磁盘文件。