程序一退出,内存里的数据就全没了。想让结果留下来,就得学文件读写。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
getline 和 >> 混用要 ignore 那个坑我上周刚踩过,盯着空行排查了半天才发现是缓冲区的问题,早看到这篇能省一小时