• c++---I/o操作


    5、文件操作

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

    我们可以通过文件将数据持久化

    C++中对文件操作需要包含头文件

    文件类型分为两种:

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

    操作文件的三大类:

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

    5.1、文本文件

    5.1.1、写文件

    步骤:

    1. 包含头文件

    ​ #include

    1. 创建流对象

    ​ ofstream ofs;

    1. 打开文件

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

    2. 写数据

    ​ ofs<<“写入的数据”;

    1. 关闭文件

      ofs.close();

    文件打开方式:

    打开方式解释
    ios::in为读文件而打开文件
    ios::out为写文件而打开文件
    ios::ate初始位置:文件尾
    ios::app追加方式写文件
    ios::trunc如果文件存在先删除,再创建
    ios::binary二进制方式

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

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

    代码示例:

    void test01() {
    	//创建流对象
    	ofstream ofs;
    	
    	//指定打开方式
        //ofs.open() 第一个参数 文件路径 ,第二个参数 对文件干什么
    	ofs.open("test.txt", ios::out);
    
    	//写内容
    	ofs << "姓名:张三" << endl;
    	ofs << "性别:男" << endl;
    	ofs << "年龄:18" << endl;
    	
    	//关闭文件
    	ofs.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    image-20230930172634795

    5.1.2、读文件

    读文件与写文件步骤类似,但是读取的方式相对较多

    读文件步骤如下:

    1. 包含头文件

    ​ #include

    1. 创建流对象

    ​ ifstream ifs;

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

    ​ ifs.open(“文件路径”,打开方式);

    1. 读数据

    ​ 四种读取方式

    1. 关闭文件

    ​ ifs.close();

    #include
    #include
    void test01() {
    	//创建流对象
    	ifstream ifs;
    	//打开文件并判断是否成功
    	ifs.open("test.txt", ios::in);
    	//ifs.is_open()判断文件是否打开成功
    	if (!ifs.is_open())
    	{
    		cout << "文件打开失败" << endl;
    		return;
    	}
    	//读数据
    	//方法1
    	// = {0}初始化字符数组
    	//char buf[1025] = { 0 };
    	//while (ifs>>buf)
    	//{
    	//	cout << buf << endl;
    	//}
    
    	//方法2
    	//ifs.getline() 一行一行读取
    	//char buf[1025] = { 0 };
    	//while (ifs.getline(buf,sizeof(buf)))
    	//{
    	//	cout << buf << endl;
    	//}
    
    	//方法3 (推荐)
    	// getline 第一个参数 基础输入流,第二个参数 存放到哪里
    	//string buf;
    	//while (getline(ifs, buf)) {
    	//	cout << buf << endl;
    	//}
    
    	//方法3
    	//EOF = end of file 文件末尾的意思
    	//ifs.get() 一个一个去读
    	char c;
    	while ((c = ifs.get())!=EOF)
    	{
    		cout << c;
    	}
    
    	//关闭文件
    	ifs.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    5.2、二进制文件

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

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

    5.2.1、写文件

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

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

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

    #include
    #include
    using namespace std;
    //二进制文件 写文件
    class Person {
    public:
    	//姓名
    	char m_Name[64];
    	int m_Age;
    };
    void test01() {
    	//创建输出流对象
    	ofstream ofs;
    	//打开文件
    	ofs.open("person.txt", ios::out | ios::binary);
    
    	//写文件
    	Person p = { "张三",18 };
    	ofs.write((const char * )&p,sizeof(Person));
    
    	//关闭文件
    	ofs.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    5.2.2、读文件

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

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

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

    示例:

    #include
    #include
    using namespace std;
    //二进制文件 读
    class Person {
    public:
    	//姓名
    	char m_Name[64];
    	int m_Age;
    };
    
    void test01() {
    	//创建流对象
    	ifstream ifs;
    
    	//打开文件 判断文件是否成功打开
    	ifs.open("person.txt", ios::in | ios::binary);
    
    	if (!ifs.is_open())
    	{
    		cout << "文件打开失败" << endl;	
    		return;
    	}
    
    	//读数据
    	Person p;
    	ifs.read((char*)&p, sizeof(Person));
    	cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
    	
    	//关闭文件
    	ifs.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    image-20230930203857347

  • 相关阅读:
    【源码定制】移植Youpk到Android 8.0 (Pixel2 XL)
    2022-09-05 ClickHouse的IN操作符说明
    ChatGPT驱动软件开发
    发布DDD脚手架到Maven仓库,IntelliJ IDEA 配置一下即可使用
    [Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题
    python使用websocket实现多端数据同步,多个websocket同步消息,断开链接自动清理
    强化学习笔记之【SAC算法】
    GD32单片机远程升级下载,手机在线升级下载程序,GD32在线固件下载升级,手机下载程序固件方法
    linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]
    《Python入门到精通》time模块详解,Python time标准库,time库函数大全
  • 原文地址:https://blog.csdn.net/NITIQ/article/details/133470358