在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(); }