【C++基础】11:文件操作

news2024/9/23 15:32:43

文件操作


OVERVIEW

  • 文件操作
      • 一、文本文件:
        • 1.指定打开方式:
        • 2.文本文件的写操作:
        • 3.文本文件的读操作:
      • 二、二进制文件:
        • 1.二进制文件的写操作:
        • 2.二进制文件的读操作:

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

  1. cpp中对文件操作需要包含头文件<fstream>
  2. 文件类型分为两种:文本文件(以文本的ASCII码形式存储)、二进制文件(以二进制形式存储)
  3. 操作文件的文件流分为三类:ofstream写操作、ifstream读操作、fstream读写操作

一、文本文件:

1.指定打开方式:

打开方式说明
ios::in只读
ios::out只写
ios::ate初始位置:文件尾
ios::app追加
ios::trunc若文件存在先删除,再创建
ios::binary二进制方式

注意:文件的打开方式可以相互组合,利用|实现(例如:用二进制方式写文件为ios::binary | ios::out

2.文本文件的写操作:

#include <fstream>//step1:包含头文件
...
ofstream ofs;//step2:创建流对象
...
ofs.open("文件路径", 打开方式)//step3:打开文件
...
ofs << "写入的数据";//step4:向文件中写入数据
...
ofs.close();//step5:关闭文件
#include <iostream>
#include <fstream>
using namespace std;

//1.文本文件写文件
void test01(){
    //(1)创建流对象
    ofstream ofs;
    //(2)指定打开方式
    ofs.open("test.txt", ios::out);
    //(3)向文件中写入数据
    ofs << "author:luochenhao" << endl;
    ofs << "gender:male" << endl;
    ofs << "age:21" << endl;
    //(4)关闭文件
    ofs.close();
}

int main(){
    test01();

    system("pause");
    return 0;
}

image-20220207193422027

在当前目录下创建了一个名为test.txt的文件,进行了向其中写入一些数据的操作。

3.文本文件的读操作:

#include <fstream>//step1:包含头文件
...
ifstream ifs;//step2:创建流对象
...
ifs.open("文件路径", 打开方式)//step3:打开文件,并判断文件是否成功打开
...
Data can be read in four ways//step4:从文件中读取数据
...
ifs.close();//step5:关闭文件 
#include <iostream>
#include <fstream>
using namespace std;

//2.文本文件读文件
void test02(){
    //(1)创建流对象
    ifstream ifs;
    //(2)打开文件,并判断是否打开成功
    ifs.open("test.txt", ios::in);
    if(!ifs.is_open()){
        cout << "文件打开失败" << endl;
        return;
    }
    //(3)从文件中读取数据
    cout << "方式1:利用while循环将文件中的数据全部放在buf字符数组中" << endl;
    char buf1[1024] = {0};
    while(ifs >> buf1) {
        cout << buf1 << endl;
    }

    cout << "方式2:利用ifs的成员函数getline一行行将文件中的数据全部放在buf字符数组中" << endl;
    char buf2[1024] = {0};
    while(ifs.getline(buf2, sizeof(buf2))) {
        cout << buf2 << endl;
    }

    cout << "方式3:利用全局函数getline一行行将文件中的数据全部放在的buf字符串中" << endl;
    string buf3;
    while(getline(ifs, buf3)){
        cout << buf3 << endl;
    }

    cout << "方式4:利用ifs的成员函数get从文件中一个个字符进行读取" << endl;
    char c;
    while((c = ifs.get()) != EOF) {
        cout << c;
    }
    //(4)关闭文件
    ifs.close();
}

int main(){
    test02();

    system("pause");
    return 0;
}

image-20220207211055618

从当前目录下读取刚才新创建的test.txt文件,将信息输出在屏幕上。

疑问:4种读取数据的方式都可行,为什么只有一次文件结果的输出?

二、二进制文件:

以二进制的方式对文件进行读写操作,打开方式需要指定为ios::binary

1.二进制文件的写操作:

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

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

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

#include <iostream>
#include <fstream>
using namespace std;

//1.二进制文件写文件
class Person{
public:
    char name[64];
    int age;
};

void test01(){
    //(1)创建流对象
    ofstream ofs;
    //(2)指定打开方式
    ofs.open("person.txt", ios::out|ios::binary);
    //(3)向文件中写入数据
    Person p1 = {"luochenhao", 21};
    ofs.write((const char *)&p1, sizeof(Person));
    //(4)关闭文件
    ofs.close();
}

int main(){
    test01();

    system("pause");
    return 0;
}

image-20220207215800368

在当前目录下创建了一个名为person.txt的文件,进行了向其中以二进制的方式写入一些数据的操作。

注意:由于数据是以二进制的方式写入,直接打开person.txt文件后发现有些数据无法正常显示属于正常。

2.二进制文件的读操作:

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

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

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

#include <iostream>
#include <fstream>
using namespace std;

//2.二进制文件读文件
class Person{
public:
    char name[64];
    int age;
};

void test02(){
    //(1)创建流对象
    ifstream ifs;
    //(2)打开文件,并判断是否打开成功
    ifs.open("person.txt", ios::in|ios::binary);
    if(!ifs.is_open()){
        cout << "文件打开失败!" << endl;
        return;
    }
    //(3)从文件中读取数据
    Person p2;
    ifs.read((char *)&p2, sizeof(Person));
    cout << "姓名:" << p2.name << endl;
    cout << "年龄:" << p2.age << endl;
    //(4)关闭文件
    ifs.close();
}

int main(){
    test02();

    system("pause");
    return 0;
}

image-20220207220910945

从当前目录下读取刚才新创建的person.txt文件,将信息输出在屏幕上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA设计模式--行为型模式--状态模式

1.状态模式&#xff08;State Pattern&#xff09; 1.1介绍 类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 1.2意图&#xff1a; 允许对象在…

Python数据分析案例16——水质检测(支持向量机)

本次带来图片分类的案例&#xff0c;水质检测。 数据展示 五种类别的水质&#xff0c;图片形式储存的&#xff1a; 前面1是代表水质的类别标签&#xff0c;后面是样本个数。 图片特征构建 import numpy as np import pandas as pd import matplotlib.pyplot as plt import o…

pytorch应用(入门5)CNN卷积神经网络、提取层结构、提取参数

目录第一天第二章&#xff1a;简单的神经网络第三章&#xff1a;深度学习工作流程卷积模块介绍卷积池化层池化层书中的代码池化层相关资料提取 &#xff08;各&#xff09;层&#xff08;的&#xff09;结构如何提取参数及自定义初始化LeNetAlexNetVGGNetCIFAR 10VGGNetGoogLeN…

JSP ssh医疗报销管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 医疗报销管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

【C++基础】07:多态

多态 OVERVIEW多态一、多态1.基本概念&#xff1a;2.E1-计算器类3.纯虚函数&抽象类&#xff1a;4.E2-制作饮品5.虚析构&纯虚析构&#xff1a;6.E3-电脑组装二、运算符重载1.加号运算符重载&#xff1a;2.左移>>运算符重载&#xff1a;3.递增运算符重载&#xff1…

数据结构课设-小老鼠走迷宫(JAVA版)

学校题目: 题目内容: 程序开始运行时显示一个迷宫地图&#xff0c;迷宫中央有一只老鼠&#xff0c;迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求&#xff1a; ⑴老鼠形象可以辨认&#xff0c;可用键盘操纵老鼠上下…

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用Docker。 今天尝试在小米的万兆路由器里安装可道云(Kodexplorer)私有网盘。 准备工作 先将一块USB外接硬盘格式化为ext4格式&#xff0c;然后外接到小米路由器上&#xff0c; 然后创建虚拟内存&#xff0c;我这里最…

Vectornet源码详解

代码资源地址见最后 1.数据与环境配置 首先,我们需要下载这个API,方便对数据做特征工程,目前这个api还不支持windows版本 https://github.com/argoverse/argoverse-api 按照上面的步骤所说,第一步需要下载这个项目,第二步需要下载一些配置文件,并按照上述方…

Linux 信号处理简析

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 分析背景 本文基于 ARM32 架构 Linux 4.14 内核源码进行分析。 3. 信号概述 3.1 信号分类 信号这个概念&#xff0c;起始于 UNIX 操作系统&…

4、程序计数器PC

介绍 JVM中的程序计数寄存器&#xff08;Program Counter Register&#xff09;中&#xff0c;Register的命名源于CPU的寄存器&#xff0c;寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里&#xff0c;并非是广义上所指的物理寄存器&#xff0c;或许…

XINDOO的2022年年终总结

已经好几个月没有认认真真写一篇博客了&#xff0c;借着年底静下心来认认真真写一篇年终总结&#xff0c;这也是我人生中第10篇的年终总结了。 先看下去年立的flag&#xff0c;不用想去年立的flag一个都没完成。首先1 算是勉强及格&#xff1b;2 redis的博客一篇没写&#xff1…

前端学习第二站——JavaScript

目录 1. 简介 2. 变量与数据类型 2.1 声明变量 2.2 基本类型 2.3 对象类型 2.3.1 函数 Function ​ 2.3.2 数组Array 2.3.3 对象 Object ⭐️⭐️ 3. 运算符和表达式 1) 2) || 4) ... 5) [] {} 4. 控制语句 1) for in 2) for of 3) try catch 1. 简介 JavaScr…

移动应用安全过去及未来发展情况思考汇总

声明 本文是学习移动安全总结 2019. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 序言 随着2019年的逝去&#xff0c;二十一世纪第二个十年也已随之结束。回顾过去的十年&#xff0c;我们的生活随着科技的进步发生了翻天覆地的变化&#x…

MySQL索引最佳实践及Explain详解

一、Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设置一个标记&#xff0c;执行查询会返回执行计划的信息&#xff0c;而不是执行这条SQL …

leetcode 169. 多数元素-java题解

题目所属分类 超经典问题 可以选用投票法 原题链接 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 代码案例&#xff1a;输入…

java 瑞吉外卖优化day2 读写分离 ShardingJDBC

问题分析&#xff1a; mysql主从复制 介绍&#xff1a; 补充&#xff1a;从库可以有多个 提前准备好两台服务器&#xff0c;分别安装Mysql并启动服务成功 主库Master 192.168.138.100 从库Slave 192.168.138.101 Window系统则是在my.ini文件里直接配置 mysql -uroot -…

Day 16-Vue3 技术_新的组件

1.Fragment —— 片段组件 在Vue2中: 组件必须有一个根标签。 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个内置Fragment虚拟元素中&#xff0c; 最后是不参与页面渲染的&#xff01; 好处: 减少标签层级, 减小内存占用。 <template><fragment>…

UART实验

目录 一、UART 1.1简介 1.2并行通信和串行通信 1.3单工和双工 1.4波特率 1.5UART帧格式 1.6UART硬件连接 1.7UART控制器 二、Exynos4412的UART控制器 三、UART寄存器 四、UART编程 五、输入输出重定向 六、使用串口控制LED 一、UART 1.1简介 Universal Asynch…

Elasticsearch学习

基本概念 运维角度物理概念 分片&#xff08;shard&#xff09;&#xff1a;一个索引所占用的物理空间分配 primary shard&#xff1a;解决数据水平扩展问题&#xff0c;分片数据量过大时&#xff0c;可以通过增加DataNode节点扩容。一个主分片等于一个lucene实例。创建索引时…

windows认证之本地认证

windows认证包括本地认证、网络认证和域认证三个部分windows认证和密码的抓取可以说是内网渗透的第一步。 1、window认证流程 Windows的登陆密码是储存在系统本地的SAM文件中的&#xff0c;在登陆Windows的时候&#xff0c;系统会将用户输入的密码与 SAM文件中的密码进行对比&…