在C++中如果想要读写文件,需要引入一个库fstream,代表的是file stream,文件流的意思:
#include <fstream>
接下来定义一个简单的写文件的函数:
void write_file() {
ofstream ofs; // ofstream代表的是out file stream,即文件输出流,是一个对象
ofs.open("test.txt", ios::out); // 打开一个名字为test.txt的文件,打开方式是写出
ofs << "Name: LiangChengHQR" << endl; // 写入一行
ofs << "Age: 19" << endl; // 写入一行
ofs.close(); // 关闭流,这是个好习惯
}
接下来写一个简单的读文件函数:
void read_file() {
ifstream ifs; // ifstream代表的是in file stream,即文件输入流,也是一个对象
ifs.open("test.txt", ios::in); // 打开一个名字为test.txt的文件,方式为读入
if (!ifs.is_open()) { // 通过is_open函数判断文件是否真正被打开了,如果文件不存在或权限不足则无法打开
cout << "File cannot be opened!" << endl;
return;
}
//接下来,要使用流的方式读入文件
//第一种方式,直接读入
char buffer[1024] = {0}; // 初始化一个字符数组,长度为1024字节,即一次可以读入1024个字符
while (ifs >> buffer) { // 循环从ifs读入内容到buffer数组内,每次都会返回读入了多少内容,注意非零为真!
cout << buffer << endl; // 输出buffer
}
//第二种方式,逐行读取
char buffer[1024] = {0}; // 仍然是初始化一个1024字节的数组
// 注意这里,雀食是一行一行读入,但如果一行大于1024个字节,那也会结束结束本次读取
// 也就是说,读满了会输出,读到了换行符\n也会输出!
while (ifs.getline(buffer,sizeof(buffer))) {
cout << buffer << endl;
}
//第二种方式的优化
string buffer; // 通过调用内置string,真正实现读到换行符才换行,不会被长度左右
while(getline(ifs, buffer)) { // getline是fstream库内定义的一个函数
cout << buffer << endl;
}
//第三种方式,最落后
chat c; // 每次只读入一个字符
while((c = ifs.get()) != EOF) { // 每次读入一个字符,只要读入的不是EOF,文件结束标志,那就继续读
cout << c << " ";
}
ifs.close(); // 注意,输入流也要关闭!
}
比较上述三种读入方式,还是定义一个string然后直接getline读取是最爽最好用的啊!
如果我们想存储一个对象,或者一些别的文件,就需要使用到二进制读写了,首先我们书写一个简单的类:
class Person {
public:
char name[10];
int age;
};
然后,我们新建一个Person对象并保存在一个文件内:
void write_binary_file() {
ofstream ofs; // 一样是文件输出流
ofs.open("test.txt", ios::out | ios::binary); // 此处多了一个ios::binary就是告诉系统以二进制输出
Person p = { "Gong", 18 }; // 新建一个对象
// 注意这种写法,把p对象完全转换成一个char数组,这样就可以以字符形式写入文件了
ofs.write((const char*)&p, sizeof(p)); // 第二个参数是写多少进去,p多大就写多少
ofs.close();
}
然后,我们读入这个二进制文件,并同时创建这个Person对象:
void read_binary_file() {
ifstream ifs;
ifs.open("test.txt", ios::in | ios.binary); // 以二进制读入
if (!ifs.is_open()) {
cout << "File failed to be opened!" << endl;
return;
}
Person p;
ifs.read((const char*)&p, sizeof(p)); // 和写出一样,把读入的内容转换成字符数组直接写到p对象内
cout << p.name << " " << p.age << endl;
ifs.close();
}