C++文件IO操作详解
程序在执行过程中会产生各种临时数据,这些数据存储在内存中,一旦程序结束就会被释放。若要实现数据的持久化存储就需要使用文件操作功能。
C++标准库提供了完善的文件处理能力,主要通过<fstream>头文件来实现。根据数据存储方式的不同,文件可分为两种类型:
文本文件以ASCII字符形式存储数据,可直接用文本编辑器查看;二进制文件则以二进制形式存储,内部数据不具有可读性,需要通过特定程序解析。
文件操作的核心类:
C++提供了三个主要的文件流类:ofstream用于数据写入,ifstream用于数据读取,fstream则同时支持读写操作。
文本文件处理流程:
进行文本文件操作需要遵循以下步骤:首先引入fstream头文件,然后创建相应的流对象,接着指定路径和打开模式进行文件操作,最后记得关闭文件流。
| 打开模式 | 功能说明 |
|---|---|
| ios::in | 读取模式打开文件 |
| ios::out | 写入模式打开文件 |
| ios::ate | 定位到文件末尾 |
| ios::app | 追加模式写入 |
| ios::trunc | 文件存在时先清空 |
| ios::binary | 以二进制方式操作 |
以下示例展示了文本文件的写入和读取方法:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 执行文本写入功能
void testWrite() {
ofstream outputStream("data.txt", ios::out);
outputStream << "这是一段测试数据" << endl;
outputStream << "第二行内容" << endl;
outputStream.close();
}
// 执行文本读取功能
void testRead() {
ifstream inputStream("data.txt", ios::in);
if (!inputStream.is_open()) {
cout << "无法打开文件" << endl;
return;
}
string content;
while (getline(inputStream, content)) {
cout << content << endl;
}
inputStream.close();
}
int main() {
testWrite();
testRead();
return 0;
}
二进制文件处理:
二进制模式适用于存储结构化数据,如自定义类的实例。启用二进制模式需要在打开文件时指定ios::binary标志。
二进制写入操作通过流对象的write成员函数实现,该函数接受两个参数:指向数据缓冲区的const char指针和要写入的字节数。
#include <iostream>
#include <fstream>
using namespace std;
struct StudentInfo {
char name[64];
int score;
};
int main() {
ofstream writeStream;
writeStream.open("student.dat", ios::out | ios::binary);
StudentInfo student = {"李四", 95};
writeStream.write(reinterpret_cast<const char*>(&student), sizeof(StudentInfo));
writeStream.close();
cout << "数据已写入文件" << endl;
return 0;
}
二进制读取采用类似的方式,将数据从文件读取到内存缓冲区中。
#include <iostream>
#include <fstream>
using namespace std;
struct EmployeeRecord {
char employeeName[64];
int employeeId;
};
int main() {
ifstream readStream;
readStream.open("employee.bin", ios::in | ios::binary);
if (!readStream.is_open()) {
cout << "文件打开失败" << endl;
return 1;
}
EmployeeRecord employee;
readStream.read(reinterpret_cast<char*>(&employee), sizeof(EmployeeRecord));
cout << "员工姓名:" << employee.employeeName << endl;
cout << "员工编号:" << employee.employeeId << endl;
readStream.close();
return 0;
}
通过灵活运用这些文件操作技术,可以实现各类数据的持久化存储与读取。