Cpp文件操作

Posted by LemonWhale on May 20, 2024
  • 程序运行时的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件操作可以将数据持久化
  • C++中对文件操作需要包含头文件<fstream>

  • 文件类型分为两种
    • 文本文件 - ASCLL码形式存储
    • 二进制文件 - 二进制形式存储
  • 操作文件的三大类
    • ofstream : 写操作
    • ifstream : 读操作
    • fstream : 读写操作

      一、文本文件

      1.1 写文件
      1. 包含头文件 #include<fstream>
      2. 创建流对象 ofstream ofs;
      3. 打开文件 ofs.open("path",打开方式);
      4. 写数据 ofs<<"写入的数据";
      5. 关闭文件 ofs.close()
  • 文件打开方式

| 打开方式 | 解释 | | :———: | :———–: | | ios::in | 为读文件而打开文件 | | ios::out | 为写文件而打开文件 | | ios::ate | 初始位置:文件尾 | | ios::app | 追加方式写文件 | | ios::trunc | 如果文件存在先删除,再创建 | | ios::binary | 二进制方式操作文件 | 注意:文件打开方式可以配合使用,使用 | 操作符 例如:用二进制方式写文件 ios::binary | ios::out

#include <iostream>  
#include <fstream>  
using namespace std;  
  
void test() {  
    ofstream ofs;  
    ofs.open("testFile/test.txt", ios::out);  
    ofs << "张三" << endl;  
    ofs << "年龄:18" << endl;  
    ofs << "性别:男" << endl;  
    ofs.close();  
    cout << "Test over." << endl;  
}  
  
int main() {  
    test();  
    return 0;  
}
1.2 读文件
  1. 包含头文件 #include<fstream>
  2. 创建流对象 ifstream ifs;
  3. 打开文件,并且判断是否读取成功 ifs.open("path",打开方式); ifs.isopen();
  4. 读数据(多种方式)
    1. 全部读取ifs >> buf
    2. 读取一行ifs.getline(buf, sizeof(buf));
    3. 读取一行getline(ifs, buf)); // buf为string
    4. 读取一个数据 (c = ifs.get()) != EOF // end of file
  5. 关闭文件 ifs.close(); ```Cpp #include #include // 1. 包含头文件 #include using namespace std;

void test() {

// 2. 创建流对象
ifstream ifs;

// 3. 打开对象并判断是否文件打开成功
ifs.open("testFile/test.txt", ios::in);
if (!ifs.is_open()) {
    cout << "文件打开失败!" << endl;
    return;
}

// 4. 读文件
// 第一种读取方式
//    char buf[1024];
//    while (ifs >> buf) {
//        cout << buf << endl;
//    }

// 第二种读取方式
//    char buf2[1024];
//    while (ifs.getline(buf2, sizeof(buf2))) {
//        cout << buf2 << endl;
//    }

// 第三种方式
string buf3;
while (getline(ifs, buf3)) {
    cout << buf3 << endl;
}

// 第四种方式 不推荐 速度慢
//    char c;
//    while ((c = ifs.get()) != EOF) {
//        cout << c;
//    } }

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


#### 二、二进制文件
##### 2.1 写文件
- 打开方式要指定为`ios::binary`
- 函数原型:`ostream &write(const char* buffer, int len);`
```Cpp
#include <iostream>
// 1. 包含头文件
#include <fstream>
using namespace std;

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

void test() {
    Person p = {"张三", 18};
    // 2. 创建流对象
    ofstream ofs;
    // 3. 打开文件
    ofs.open("testFile/testBinary.txt", ios::binary | ios::out);
    // 4. 写文件函数 ostream &write(const char* buffer, int len);
    ofs.write((const char *)&p, sizeof(p));
    // 5. 关闭文件
    ofs.close();
}

int main() {
    test();
    return 0;
}
2.2 读文件
  1. 包含头文件 #include<fstream>
  2. 创建流对象 ifstream ifs;
  3. 打开文件,并且判断是否读取成功 ifs.open("path",ios::in | ios::binary); ifs.isopen();
  4. 读数据(多种方式) ifs.read((char *)&p, sizeof(p));
  5. 关闭文件 ifs.close(); ```Cpp #include // 1. 包含头文件 #include using namespace std;

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

void test() { // 2. 创建流对象 ifstream ifs; // 3. 打开文件 ifs.open(“testFile/testBinary.txt”, ios::binary | ios::in); // 4. 写文件函数 ostream &write(const char* buffer, int len); Person p; ifs.read((char *)&p, sizeof(Person)); cout « “姓名 : “ « p.m_Name « ” 年龄 : “ « p.m_Age « endl; // 5. 关闭文件 ifs.close(); }

int main() { test(); return 0; } ```

  • 需要有相应的数据类型接收数据