C++ 文件和流学习笔记

文件的基本操作

在 C++ 中,我们可以使用标准库中的 fstream 类和其派生类来进行文件的输入和输出操作。

打开文件

在进行文件操作之前,我们需要打开文件。可以使用 fstream 的构造函数来打开文件,也可以使用 open() 成员函数来打开文件。

cppCopy Code
#include <fstream> using namespace std; int main() { // 使用构造函数打开文件 fstream file("example.txt"); // 使用 open() 函数打开文件 fstream file; file.open("example.txt"); return 0; }

其中,文件名需要用引号括起来。

写入文件

使用 fstream 对象的 << 运算符来写入数据到文件中。

cppCopy Code
#include <fstream> #include <iostream> using namespace std; int main() { fstream file("example.txt", ios::out); if (file.is_open()) { file << "Hello, world!\n"; file << 123 << endl; file.close(); } else { cerr << "Failed to open file!" << endl; } return 0; }

这里我们用 ios::out 来指定文件的写模式。

读取文件

使用 fstream 对象的 >> 运算符来从文件中读取数据。

cppCopy Code
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { fstream file("example.txt", ios::in); if (file.is_open()) { string line; while (getline(file, line)) { cout << line << endl; } file.close(); } else { cerr << "Failed to open file!" << endl; } return 0; }

这里我们用 ios::in 来指定文件的读模式,并且使用 getline() 函数读取一行内容。

文件流的高级操作

文件指针

文件指针是一个指向文件中特定位置的指针。通过文件指针,我们可以在文件中定位,读取或写入特定的数据。

使用 seekg()seekp() 成员函数可以改变文件指针所指向的位置。

cppCopy Code
#include <fstream> #include <iostream> using namespace std; int main() { fstream file("example.txt", ios::in | ios::out); if (file.is_open()) { // 设置读取位置 file.seekg(5); int n; file >> n; cout << "Read value: " << n << endl; // 设置写入位置 file.seekp(0, ios::end); file << "Appending message" << endl; file.close(); } else { cerr << "Failed to open file!" << endl; } return 0; }

这里我们使用 ios::in | ios::out 来指定文件的读写模式。seekg()seekp() 的第一个参数为位置,可以是一个整数值或一个 streampos 类型的对象。第二个参数是指针移动的参考点,可以是 ios::beg(文件头)、ios::cur(当前位置)或 ios::end(文件末尾)。

二进制文件

除了文本文件,C++ 也可以处理二进制文件。打开二进制文件时需要使用 ios::binary 模式。

cppCopy Code
#include <fstream> #include <iostream> using namespace std; int main() { fstream file("example.bin", ios::in | ios::out | ios::binary); if (file.is_open()) { // 写入二进制数据 int n = 123; file.write((char*)&n, sizeof(n)); // 读取二进制数据 file.seekg(0); int m; file.read((char*)&m, sizeof(m)); cout << "Read value: " << m << endl; file.close(); } else { cerr << "Failed to open file!" << endl; } return 0; }

注意,我们需要使用 C 风格的字符指针来访问二进制数据。与文本文件不同,二进制文件可以包含任意的字节,而非只能是可打印字符。

示例

下面是一个从文件中读取 CSV 格式数据进行排序的示例。

假设有一个名为 data.csv 的文件,内容如下:

Copy Code
1, Bob 3, Alice 2, Charlie

我们将读取文件中的每一行,并对第一列进行排序。代码如下:

cppCopy Code
#include <fstream> #include <iostream> #include <sstream> #include <string> #include <vector> #include <algorithm> using namespace std; struct Record { int id; string name; }; bool compare_records(const Record& a, const Record& b) { return a.id < b.id; } int main() { fstream file("data.csv", ios::in); if (file.is_open()) { vector<Record> records; string line; while (getline(file, line)) { stringstream ss(line); char [Something went wrong, please try again later.]