程序一退出,内存里的数据就全没了。想让结果留下来,就得学文件读写。C++ 标准库的 fstream 头文件提供了三个好用的类:ofstream 往文件里写,ifstream 从文件里读,fstream 读写都行。这篇讲最常用的前两个。

往文件里写:ofstream

#include <iostream>
#include <fstream>      // 文件操作都在这个头文件
using namespace std;

int main() {
    ofstream out("score.txt");     // 打开,没有就自动创建

    out << "小明 95" << endl;      // 用法跟 cout 一模一样
    out << "小红 88" << endl;

    out.close();                   // 用完关闭
    return 0;
}
// 运行后目录里会多出 score.txt,内容是两行成绩

<< 和 cout 用法相同,endl 表示换行并刷新缓冲区。

打开失败怎么办

文件可能根本不存在,也可能没有权限,读写之前最好检查一下。

ifstream in("no_such_file.txt");
if (!in.is_open()) {
    cout << "文件打开失败" << endl;
    return 1;
}

从文件里读:ifstream

最简单的是像 cin 一样用 >>,它默认按空白分隔来读。

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

int main() {
    ifstream in("score.txt");
    string name;
    int score;

    while (in >> name >> score) {      // 每次读一个名字一个分数
        cout << name << " 的分数是 " << score << endl;
    }
    in.close();
    return 0;
}
// 输出:
// 小明 的分数是 95
// 小红 的分数是 88

while (in >> ...) 会一直读到文件末尾,读不到数据时表达式为假,循环自动结束,不需要自己判断 EOF。

按行读:getline

遇到空格就断开,想读"一整行"(比如带空格的句子)要用 getline。

string line;
ifstream in("diary.txt");
while (getline(in, line)) {
    cout << line << endl;
}

getline 和 >> 混用时有个经典的坑:>> 读完会在缓冲区里留下一个换行符,紧跟着的 getline 会直接读到一个空行。解决办法是在中间插一句 in.ignore() 把它吃掉。

追加而不是覆盖

ofstream 默认会把原来的文件清空重写。想接着旧内容往后写,加一个打开模式。

ofstream out("score.txt", ios::app);   // app = append,追加
out << "小刚 76" << endl;

常用的打开模式还有 ios::binary(按二进制处理),入门阶段掌握 app 就够用了。

小结

  • ofstream 写文件、ifstream 读文件,都在 fstream 头文件里
  • 读写前用 is_open() 确认文件真的打开了
  • 按空白分段读,getline 按行读,两者混用记得 ignore

  • 默认打开方式会覆盖旧内容,想追加要加 ios::app