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 Code1, 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.]