C++核心编程:文件操作 笔记

5.文件操作

程序运行时产生的数据都属于临时数据,程序一旦允许结束都会被释放。通过文件可以将数据持久化

  • C++中对文件操作需要包含头文件<fstream>

文件类型分为两种:

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

操作文件的三大类:

  1. ofstream - 写操作
  2. ifstream - 读操作
  3. fstream - 读

5.1.1 写文件

  • 写文件步骤
cpp 复制代码
1.写包含头文件

#include <iostream>

2.创建流对象

ofstream ofs; // 写文件

3.打开文件

ofs.open("文件路径", 打开方式);

4.写数据

ofs << "写入的数据";

5.关闭文件

ofs.close();

文件打开方式:

cpp 复制代码
    打开方式            解释

    ios::in            为读文件而打开文件

    ios::out           为写文件而打开文件

    ios::ate           初始位置:文件尾

    ios::app           追加方式写文件

    ios::trunc         如果文件存在先删除,再创建

    ios::binary        二进制方式

注意:文件打开方式可以配合使用,利用|操作符

例如:用二进制方式写文件 ios::binary | ios::out

cpp 复制代码
#include <iostream>
using namespace std;
// 1.包含头文件
#include <fstream>

void test01() {
    // 2.创建流对象
    ofstream ofs;
    // 3.打开文件 指定打开方式
    ofs.open("test.txt", ios::out); // 参数1:文件路径;参数2:文件打开模式
    // 4.写入数据
    ofs << "hello, world!" << endl;
    ofs << "hello, c++!" << endl;
    ofs << "姓名: 张三"<<endl;
    ofs << "年龄: 18"<<endl;
    ofs << "性别: 男"<<endl;
    // 5.关闭文件
    ofs.close();
}

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

总结:

  • 文件操作必须包含头文件 fstream
  • 写文件可以利用 ofstream,或者fstream类
  • 打开文件时候需要指定操作文件的路径,以及打开方式
  • 利用<<可以向文件中写数据
  • 操作完毕,要关闭文件

5.1.2 读文件

  • 读文件与写文件步骤相似,但是读取方式相对于比较多

读文件步骤如下:

cpp 复制代码
1.包含头文件

    #include <fstream>

2.创建流对象

    ifstream ifs; // 读文件

3.打开文件并判断文件是否打开成功

    ifs.open("文件路径", 打开方式);

4.读数据

    四种方式读取

5.关闭文件

    ifs.close();
cpp 复制代码
#include <iostream>
// 1.包含头文件
#include <fstream>
using namespace std;
#include <string>

// 文本文件 读文件
void test01() {
    // 2.创建流对象
    ifstream ifs;
    // 3.打开文件 并且判断是否打开成功
    ifs.open("test.txt", ios::in);
    if (!ifs.is_open()) {
        cout << "文件打开失败" << endl;
        return;
    }
    // 4.读数据
    // 第一种
    // char buf[1024] = {0};
    // while (ifs >> buf) {
    //     cout<<buf<<endl;
    // }

    // 第二种
    // char buf[1024] = {0};
    // while(ifs.getline(buf, sizeof(buf))) {
    //     cout<<buf<<endl;
    // }

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

    // 第四种
    // char c;
    // while((c=ifs.get())!= EOF) { //EOF end of file
    //     cout<<c;
    // }
    
    // 5.关闭
    ifs.close();
}

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

总结:

  • 读文件可以利用ifstream,或者fstream类
  • 利用is_open函数可以判断文件是否打开成功
  • close关闭文件

5.2 二进制文件

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

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

5.2.1 写文件

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

  • 函数原型:ostream& write(const char *buffer, int len);
  • 参数解释:字符指针buffer指向内存中一段存储空间(可以是数组,也可以是c++字符串),len是读写的字节数
cpp 复制代码
#include <iostream>
using namespace std;
#include <fstream>
// 二进制文件 写文件
class Person {
public:
    char m_Name[64]; // 姓名
    int m_Age;// 年龄
};

void test01() {
    // 1.包含头文件
    // 2.创建流对象
    ofstream ofs; 
    // ofstream ofs.open("person.txt", ios::out | ios::binary);
    // 3.打开文件
    ofs.open("person.txt", ios::out | ios::binary);
    // 4.写文件
    Person p = {"张三", 20};
    ofs.write((const char*)&p, sizeof(Person));
    // 5.关闭文件
    ofs.close();
}

int main() {
    test01(); // 写文件
    return 0;
}

5.2.2 读文件

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

  • 函数原型:istream& read(char *buffer, int len);
  • 参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数
  • 文件输入流对象,可以通过read函数,以二进制方式读数据
cpp 复制代码
#include <iostream>
#include <fstream>
using namespace std;

class Person {
public:
    char m_Name[64]; //姓名
    int m_Age; //年龄
};

// 二进制文件 读文件
void test01() {
    // 1.包含头文件

    // 2.创建流对象
    ifstream ifs;
    // 3.打开文件 判断文件是否打开成功
    ifs.open("person.txt", ios::in | ios::binary);
    
    if(!ifs.is_open()) {
        cout<<"打开文件失败"<<endl;
        return;
    }
    // 4.读文件
    Person p;
    ifs.read((char*)&p, sizeof(Person));
    cout<<"姓名:"<<p.m_Name<<" 年龄:"<<p.m_Age<<endl; 
    // 5.关闭文件
    ifs.close();
}

int main() {
    test01();
    return 0;
}
相关推荐
我爱挣钱我也要早睡!11 分钟前
Java 复习笔记
java·开发语言·笔记
汇能感知5 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun5 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao5 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾6 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
利刃大大6 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
DKPT6 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J7 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
C语言小火车7 小时前
【C++八股文】基础知识篇
c++·tcp/ip·const·智能指针·多线程同步·static关键字·c++内存模型
Suckerbin7 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全