C++学习笔记(六)

2021/12/24 C++

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放

通过文件可以将数据进行持久化操作

C++中对文件的操作需要包涵头文件:<fstream>

文件类型有两种:

  • 文本文件:文件以文本的ASCII码的形式存储在计算机中
  • 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

  • ofstream:写操作
  • ifstream:读操作
  • Fstream:读写操作

# 一、写文件

步骤如下所示:

  • 包涵头文件:#include <fstream>
  • 创建流对象:ofstream ofs;
  • 打开文件:ofs.open("文件路径", 打开方式)
  • 写数据:ofs << "写入的数据"
  • 关闭文件:ofs.close()

打开方式:

image-20211223170816397

文件打开方式可以配合使用,利用|操作符,如使用二进制方式写文件:ios::binary | ios::out

#include "iostream"
#include "fstream"

using namespace std;


void makeFile() {
    ofstream ofs;
    ofs.open("test.txt", ios::out);
    ofs << "Hello World!" << endl;
    ofs.close();
    cout << "执行成功" << endl;
}

int main() {
    makeFile();
    return 0;
}

# 二、读文件

步骤如下所示:

  • 包涵头文件:#include <fstream>
  • 创建流对象:ifstream ifs;
  • 打开文件:ifs.open("文件路径", 打开方式)
  • 四种方式进行读取
  • 关闭文件:ifs.close()
//
// Created by Jacob Lee on 2021/12/23.
//
#include "iostream"
#include "fstream"

using namespace std;


void readFile() {
    ifstream ifs;
    ifs.open("test.txt", ios::in);
    if (!ifs.is_open()) {
        cout << "文件打开失败" << endl;
        return;
    }
    // 读数据
    // 方法一
    char buf01[1024] = {0};
    while(ifs >> buf01) {
        cout << buf01 << endl;
    }
    // 方法二
    char buf02[1024] = {0};
    while(ifs.getline(buf02, sizeof(buf02))) {
        cout << buf02 << endl;
    }
    // 方法三
    string buf03;
    while(getline(ifs, buf03)) {
        cout << buf03 << endl;
    }
    // 方法四
    char c;
    while((c = ifs.get()) != EOF) {
        cout << c;
    }
    ifs.close();
}

int main() {
    readFile();
    return 0;
}

# 三、二进制文件

以二进制的方式对文件进行读写操作

打开方式要指定为ios::binary

# 3.1二进制文件写

二进制方式写文件主要是利用流对象调用成员函数write

函数原型:ostream& write(const char * buffer, int len);

参数解释:字符指针buffer指向内存中的一段存储空间。len指的是读写的字节数

#include "iostream"
#include "fstream"

using namespace std;

class Person {
public:
    char m_Name[64];
    int m_Age;
};

int main() {
    ofstream ofs;
    ofs.open("person.txt", ios::out | ios::binary);
    Person person = {"Lee", 18};
    ofs.write((const char *)&person, sizeof(Person));
    ofs.close();
    return 0;
}

# 3.2二进制文件读

二进制方式读文件主要利用流对象调用成员函数read

函数原型:istream& read(char *buffer, int len);

参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

//
// Created by Jacob Lee on 2021/12/23.
//
#include "iostream"
#include "fstream"

using namespace std;

class Person {
public:
    char m_Name[64];
    int m_Age;
};

int main() {
    ifstream ifs;
    ifs.open("person.txt", ios::in | ios::binary);
    if (!ifs.is_open()) {
        cout << "文件打开失败" << endl;
        return 0;
    }
    Person person;
    ifs.read((char *)& person, sizeof(Person));
    cout << person.m_Name << endl;
    cout << person.m_Age << endl;
    ifs.close();
    return 0;
}