RaymondHuang
RaymondHuang
发布于 2022-12-18 / 109 阅读
0
0

文件的读写(IO流)

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


评论