C++ 文件操作详解
在C++中,文件操作分为文本文件和二进制文件的操作,通过文件流类(ifstream
、ofstream
、fstream
)进行文件的读写。这些类封装了文件的输入和输出操作,并继承了istream
和ostream
的功能,使得流对象既可以用于标准输入输出,也可以用于文件的读写。
本文将详细讲解如何在C++中使用文件流进行文件操作,并会通过代码示例逐步说明。
一、I/O流概述
C++文件操作主要依赖以下头文件:
#include <fstream>
C++中的文件操作主要通过以下三个类来实现:
ofstream
:继承自ostream
类,主要用于文件的写操作。ifstream
:继承自istream
类,主要用于文件的读操作。fstream
:继承自ifstream
和ofstream
类,既可用于文件的读操作,也可用于写操作。
二、文本文件的读写操作
1. 创建流对象并打开文件
在打开文件时,可以选择使用构造函数直接打开,或者创建对象后再通过open
函数进行打开:
-
通过构造函数直接打开文件:
ofstream fout("filename.txt", ios::out);
-
先创建对象再打开文件:
ofstream fout; fout.open("filename.txt", ios::out);
文件打开模式
open
函数提供多种模式控制文件的打开方式:
ios::app
:追加模式,从文件末尾写入。ios::ate
:打开文件时将指针指向文件末尾。ios::binary
:以二进制模式打开文件。ios::in
:以读模式打开文件。ios::out
:以写模式打开文件。ios::trunc
:清空文件内容(文件已存在时)。
ifstream fin("filename.txt", ios::in | ios::binary);
2. 判断文件是否成功打开
可以使用以下方式判断文件是否成功打开:
-
!对象
:直接使用对象的逻辑取反判断
if (!fin) {
cout << "文件打开失败" << endl;
} else {
cout << "文件打开成功" << endl;
}
-
good()
和fail()
:判断上一次文件操作的成功与失败。if (fin.good()) { cout << "上一次操作成功" << endl; } else { cout << "上一次操作失败" << endl; }
3. 文件的读写操作
文本文件的读写直接使用流运算符:
-
写操作:
fout << "Hello, world!" << endl;
-
读操作:
string line; fin >> line;
4. 关闭文件
关闭文件使用close()
方法:
fout.close();
示例代码:将学生类对象写入文件
我们创建一个简单的Student
类并将其对象写入到文本文件中。
#include <iostream>
#include <fstream>
using namespace std;
class Student {
private:
string name;
int age;
public:
Student(string n, int a) : name(n), age(a) {}
friend ofstream& operator<<(ofstream &out, const Student &s) {
out << s.name << " " << s.age;
return out;
}
};
int main() {
Student s("Alice", 20);
ofstream fout("stu.txt");
if (fout.is_open()) {
fout << s;
fout.close();
}
return 0;
}
三、随机读写操作
C++支持文件流的随机访问,即可以在文件中任意位置读写数据。主要有以下几个函数:
seekg
:设置输入流位置。seekp
:设置输出流位置。tellg
:获取输入流当前位置。tellp
:获取输出流当前位置。
例如,将指针移动到文件的开头或末尾:
fin.seekg(0, ios::beg); // 从文件开头读取
fout.seekp(0, ios::end); // 从文件末尾写入
四、二进制文件的读写操作
1. 创建流对象并打开文件
以二进制模式打开文件时,需要添加ios::binary
标志:
fstream fs("data.bin", ios::in | ios::out | ios::binary);
2. 读写二进制文件
使用write
和read
函数进行二进制数据的写入和读取:
-
写入数据:
int num = 100; fout.write(reinterpret_cast<char*>(&num), sizeof(num));
-
读取数据:
int num; fin.read(reinterpret_cast<char*>(&num), sizeof(num));
注意事项
- 二进制操作中,数据以字节方式读写,因此不能直接对包含指针的对象进行二进制读写,否则会导致数据不一致。
- 可以使用
eof()
函数判断是否到达文件末尾。
示例代码:二进制文件的写入和读取
以下代码演示如何将一个整数以二进制方式写入文件,并读取它。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// 写入数据
ofstream fout("data.bin", ios::binary);
int num = 1234;
fout.write(reinterpret_cast<char*>(&num), sizeof(num));
fout.close();
// 读取数据
ifstream fin("data.bin", ios::binary);
int readNum;
fin.read(reinterpret_cast<char*>(&readNum), sizeof(readNum));
fin.close();
cout << "读取的数字为:" << readNum << endl;
return 0;
}
总结
本文介绍了C++文件操作的基本方法,包括文本和二进制文件的读写操作,以及流位置指针的控制。掌握这些操作后,便可以在C++程序中高效地处理文件数据。