在 C++ 中,文件操作主要依赖于
fstream库,该库提供了文件输入输出的基础功能。文件操作可以分为读取文件和写入文件两部分,分别对应ifstream(文件输入流)和ofstream(文件输出流)。
fstream类同时支持文件的读写操作。接下来,我将详细介绍 C++ 中文件操作的相关知识,包括文件的打开、读取、写入、关闭等操作。

1. 包含头文件 <fstream>
在进行文件操作前,需要包含 <fstream> 头文件,该头文件提供了文件流类的定义:
#include <fstream>
#include <iostream>
2. 文件流类
<fstream> 头文件定义了三个主要的类:
ifstream(输入文件流):用于读取文件数据。ofstream(输出文件流):用于向文件写入数据。fstream(文件流):支持同时进行文件的读取和写入操作。
3. 打开文件
在文件操作之前,首先需要打开文件。可以使用构造函数或 open 方法打开文件。打开文件时可以指定文件的打开模式(例如读、写、追加等)。
打开模式
| 模式 | 说明 |
|---|---|
ios::in | 读模式(默认值,仅限于 ifstream) |
ios::out | 写模式(默认值,仅限于 ofstream) |
ios::app | 追加模式,数据写入到文件末尾 |
ios::ate | 打开文件后,文件指针定位到文件末尾 |
ios::trunc | 截断模式,如果文件存在,清空文件内容 |
ios::binary | 二进制模式,以二进制方式读写 |
std::ifstream fin("file.txt", std::ios::in); // 以只读模式打开
std::ofstream fout("file.txt", std::ios::out); // 以只写模式打开
std::fstream fio("file.txt", std::ios::in | std::ios::out); // 读写模式打开
💡 补充建议
为了更好地掌握文件的打开和模式,建议多尝试各种组合模式,比如同时使用 ios::in | ios::out | ios::app,观察文件的内容变化情况。
4. 检查文件是否打开成功
在打开文件后,可以通过 is_open 方法检查文件是否成功打开。若文件打开失败,应输出提示信息并进行相应处理。
std::ifstream fin("file.txt");
if (!fin.is_open()) {
std::cerr << "无法打开文件!" << std::endl;
return 1; // 返回错误码
}
💡 错误处理建议
建议在打开文件失败时提供更详细的错误信息,例如是否文件路径正确,是否权限足够,以帮助定位问题。
5. 写入文件
使用 ofstream 或 fstream 可以向文件中写入数据。写入文件类似于使用 cout 输出数据,只是目标从控制台变成了文件流对象。
#include <fstream>
#include <iostream>
int main() {
std::ofstream fout("output.txt", std::ios::out);
if (!fout) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
fout << "Hello, World!" << std::endl;
fout << "写入文件操作示例" << std::endl;
fout.close(); // 关闭文件
return 0;
}
💡 提示
可以尝试使用 ofstream 的追加模式(ios::app),观察文件内容变化,理解文件指针位置的影响。
6. 读取文件
使用 ifstream 或 fstream 可以从文件中读取数据。读取文件类似于使用 cin 从控制台输入数据,只是源数据变成了文件。
逐行读取
使用 getline 可以逐行读取文件内容:
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream fin("input.txt", std::ios::in);
if (!fin) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
std::string line;
while (getline(fin, line)) { // 持续读取直到文件结束
std::cout << line << std::endl; // 输出到控制台
}
fin.close(); // 关闭文件
return 0;
}
💡 提示
getline() 是逐行读取的非常有用的函数,适用于读取文本文件的内容。可以尝试读取包含不同数据格式的文件,理解如何解析内容。
按单词读取
可以使用 >> 运算符按单词读取文件内容:
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream fin("input.txt", std::ios::in);
if (!fin) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
std::string word;
while (fin >> word) { // 每次读取一个单词
std::cout << word << std::endl;
}
fin.close(); // 关闭文件
return 0;
}
💡 提示
对于带有标点符号的文本,>> 运算符会将标点符号和单词分开。可以尝试使用正则表达式来更灵活地处理单词分割。
7. 文件的随机访问
在文本或二进制文件中,可以通过 seekg 和 seekp 函数实现随机访问,分别用于输入和输出流。
seekg:用于设置读取位置seekp:用于设置写入位置
位置参数:
| 参数 | 说明 |
|---|---|
ios::beg | 文件开头 |
ios::cur | 当前位置 |
ios::end | 文件末尾 |
#include <fstream>
#include <iostream>
int main() {
std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::trunc);
file << "Hello, World!";
file.seekp(0, std::ios::beg); // 设置写指针到文件开头
file << "Hi"; // 覆盖开头的内容
file.seekg(0); // 设置读指针到文件开头
std::string content;
file >> content; // 读取文件
std::cout << content << std::endl;
file.close();
return 0;
}
💡 提示
随机访问文件在处理大型数据文件时非常有用,可以显著提高读取和写入的效率。
8. 二进制文件读写
文本文件中数据以文本格式存储,二进制文件中数据以原始二进制形式存储,文件体积更小,适合保存结构化数据(例如图像、音频等)。
使用 ios::binary 模式打开文件,然后使用 read 和 write 进行二进制读写:
#include <fstream>
#include <iostream>
struct Data {
int id;
double value;
};
int main() {
Data data = {1, 3.14};
std::ofstream fout("data.bin", std::ios::binary);
if (!fout) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
fout.write(reinterpret_cast<char*>(&data), sizeof(data));
fout.close();
return 0;
}
#include <fstream>
#include <iostream>
struct Data {
int id;
double value;
};
int main() {
Data data;
std::ifstream fin("data.bin", std::ios::binary);
if (!fin) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
fin.read(reinterpret_cast<char*>(&data), sizeof(data));
fin.close();
std::cout << "ID: " << data.id << ", Value: " << data.value << std::endl;
return 0;
}
💡 提示
在使用二进制模式时,确保数据结构的对齐方式一致,以避免跨平台数据读取时可能出现的问题。
9. 关闭文件
文件操作完成后,最好使用 close 关闭文件,以释放资源。尽管文件在析构时会自动关闭,但显式关闭文件是个好习惯。
fin.close();
fout.close();
10. 文件异常处理
可以使用 try-catch 捕获文件操作中的异常,并通过检查 fail()、eof() 和 bad() 来处理文件的状态。
std::ifstream file("test.txt");
if (!file) {
std::cerr << "文件无法打开!" << std::endl;
return 1;
}
if (file.fail()) {
std::cerr << "文件操作失败!" << std::endl;
}
if (file.eof()) {
std::cout << "已达到文件末尾" << std::endl;
}
💡 提示
bad() 和 fail() 都是检查文件状态的有用函数。bad() 检查是否发生了不可恢复的错误,而 fail() 还可以用于检测可恢复的错误。
11. 常用文件操作函数
| 函数名 | 说明 |
|---|---|
open() | 打开文件 |
is_open() | 检查文件是否打开 |
close() | 关闭文件 |
write() | 写入二进制数据 |
read() | 读取二进制数据 |
put() | 写入单个字符 |
get() | 读取单个字符 |
getline() | 读取一行文本 |
seekg() | 设置输入指针位置 |
seekp() | 设置输出指针位置 |
tellg() | 获取当前输入指针位置 |
tellp() | 获取当前输出指针位置 |
eof() | 检查是否到达文件末尾 |
fail() | 检查文件操作是否失败 |
bad() | 检查是否发生不可恢复的错误 |
good() | 检查文件流是否正常 |
clear() | 清除文件 |
1446

被折叠的 条评论
为什么被折叠?



