c++IO

前言

大家好,我是jiantaoyab,本篇文章给大家介绍c++中文件操作。

先回忆一下c语言文件操作

void Test_c_bin()
{//二进制写ServerInfo info = { "127.0.0.1", 8080 };FILE* fout = fopen("test.bin", "wb");fwrite(&info, sizeof(info), 1, fout);//二进制读 FILE* fin = fopen("test.bin", "rb");ServerInfo info;fread(&info, sizeof(info), 1, fin);std::cout << info._ip << ":" << info._port << std::endl;
}void Test_c_text()
{//文本写ServerInfo info = { "127.0.0.1", 8080};FILE* fout = fopen("test.txt", "w");fprintf(fout, "%s\n%d", info._ip, info._port);//文本读ServerInfo info;FILE* fin = fopen("test.txt", "r");fscanf(fin,"%s%d", info._ip, &info._port);printf("%s:%d\n", info._ip, info._port);
}

再看看c++中流的概念,是对一种有序连续且具有方向性的数据(单位可以是bit,byte,packet 的抽象描述。C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。它的特性是:有序连续、具有方向性。为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。

c++ IO流

image-20240420113303615

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类。

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标
准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象。

注意

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据
  2. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入
  3. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。

C++根据文件内容的数据格式分为二进制文件和文本文件,ifstream (只输入用)、ofstream(只输出用)、fstream(既输入又输出用)。

文本写文件

  1. 包含头文件:#include
  2. 创建文件流对象: ofstream ofs;
  3. 以写入方式打开文件:ofs.open(“文件路径”,ios::out);
  4. 写入内容:ofs<<“写入内容”;
  5. 关闭文件:ofs.close();

image-20240420114040616

#include<iostream>
#include<fstream>
using namespace std; 
void()
{ofstream ofs;ofs.open("test.txt", ios::out);ofs << "hello world" << endl;ofs.close();return 0;
}

文本读文件

  1. 包含头文件:#include

  2. 创建流对象:ifstream ifs;

  3. 以读取模式打开文件:ifs.open(“文件路径+文件名/文件名”,ios::in)

  4. 读取数据:常用的有4中方法

    • ifs>> int,char,float,char *,string 等等。可读取整形、浮点型、字符型、字符串等等,读取字符串时可将读取内容存入字符数组,也可存入string;读取字符串时一次读一行,遇到空格、制表符、换行符或读取到字符数组长度-1个字符时返回。读取成功返回istream&,读取失败返回false。

    • ifs.getline(char *buf,int size,char delim=‘\n’);

      一次读取一行,存入字符数组;遇到换行符或者读取到sizeof(buf)-1个字符返回(最后一个字符需要自动添加结束字符\0);遇到限定字符delim提前返回。读取失败返回false。

    • getline(istream& ifs,string& str,char delim=‘\n’);一次读取一行,存入字符串;遇到换行符和限定字符delim提前返回。读取失败返回false。

    • int get();/ istream& get(char *buf, int size,char delim=‘\n’);/istream& get(char c)

      常用的ifstream成员get函数有这几种重载;同样读取内容存入字符数组时遇到限定字符delim时提前返回,后面两种读取失败返回false。

#include<iostream>
#include<fstream>
using namespace std;
#include<string>
//方法1
void func(ifstream& ifs, string buf) {while (ifs >> buf) {cout << buf << endl;}
}
//方法2
void func(ifstream& ifs, char buf[1024]) {while (ifs.getline(buf, 1024)){cout << buf1 << endl;}
}
//方法3
void func(ifstream& ifs, string& buf) {while (getline(ifs, buf)) {cout << buf << endl;}
}
//方法4
void func(ifstream& ifs, char c) {while (ifs.get(c)) {cout << c;}
}

二进制写

  1. 包含头文件:#include

  2. 创建文件流:ofstream ofs;

  3. 以二进制方式打开文件:

    ofs.open(“文件名”,ios::binary|ios::out);

  4. 写入数据:调用成员函数

    ostream& write(const char * buffer,int len); ofs.write((const char*)ptr,sizeof(*ptr));

    字符指针buffer指向内存中一段储存空间,len是要写入字节数。

  5. 关闭文件:ofs.close();

二进制读

  1. 包含头文件:#include

  2. 创建文件流:ifstream ifs;

  3. 以二进制方式打开文件:

    ifs.open(“文件名”,ios::binary|ios::in);

  4. 读取数据:

    调用成员函数ifstream& read((char*)buf,sizeof(buf));

    buf是读取内容的缓存区强转为(char*),按照单个字节计算读取内容。

  5. 关闭文件:ifs.close();

写成一个类

#include<iostream>
#include<string>
#include<fstream>struct ServerInfo
{char _ip[32];int _port;
};//ifstream 输入 ofstream 输出
class Config
{
public:Config(const char* filename):_filename(filename){}void WriteBin(ServerInfo& info){std::ofstream ofs(_filename.c_str(), std::ios_base::out | std::ios_base::binary);ofs.write((const char*)&info, sizeof(ServerInfo));}void ReadBin(ServerInfo& info){std::ifstream ifs(_filename.c_str(), std::ios_base::in | std::ios_base::binary);ifs.read((char*)&info, sizeof(ServerInfo));}void WriteText(ServerInfo& info){std::ofstream ofs(_filename.c_str());ofs << info._ip <<" "<< info._port;}void ReadText(ServerInfo& info){std::ifstream ifs(_filename.c_str());ifs >> info._ip >> info._port;}
private:std::string _filename;
};int main()
{ServerInfo info = { "127.0.0.1", 8080 };//Test_c_bin();//Test_c_text();//二进制//Config cm("config.bin");//cm.WriteBin(info);//cm.ReadBin(info);//std::cout << info._ip << ":" << info._port << std::endl;//文本/*Config cm("config.bin");cm.WriteBin(info);cm.ReadBin(info);std::cout << info._ip << ":" << info._port << std::endl;*/
}

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

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

相关文章

18 统计网站每日的访问次数

1.将竞赛的数据上传HDFS,查看数据的格式 通过浏览器访问hdfs,查看该文档前面的部分数据 每条数据的字段值之间使用逗号隔开的 &#xff0c;最终时间是第五个自动&#xff0c;获取第五个字段值的中的年月日。 2.通过Idea创建项目mr-raceData ,基础的配置 修改pom.xml,添加依赖 …

Spring Boot集成fastdfs快速入门Demo

1.什么是fastdfs FastDFS 是一个开源的高性能分布式文件系统&#xff08;DFS&#xff09;。它的主要功能包括&#xff1a;文件存储&#xff0c;文件同步和文件访问&#xff0c;以及高容量和负载平衡。主要解决了海量数据存储问题&#xff0c;特别适合以中小文件&#xff08;建议…

从零开始搭建网站(第二天)

今天把之前的htmlcssjs项目迁移过来&#xff0c;直接使用tspiniavue3vite组合&#xff0c;搭建过程可以看从零开始搭建性能完备的网站-思路过程&#xff08;1&#xff09;_自己架设一个芯参数网站-CSDN博客。之后安装一下volar扩展。迁移过来使用Vue重构时发现之前使用的左右两…

学习-官方文档编辑方法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

电感与磁珠

电感是什么&#xff1f; 电感会通过产生感应电动势的方式来阻碍电流的变化&#xff0c;电流变化率越大&#xff0c;产生的感应电动势越大阻碍电流效果越明显。 [一]品质因数Q: 电感的品质因数Q值定义&#xff1a;电感的Q值也叫作品质因数&#xff0c;其为无功功率除以有功功率…

API请求报错 Required request body is missing问题解决

背景 在进行调用的时候&#xff0c;加载方法&#xff0c;提示以下错误 错误信息如下&#xff1a; {"code": 10001,"msg": "Required request body is missing: XXX","data": null,"extra": null }Required request body…

ubuntu22.04下编译ffmpeg和ffplay

Ubuntu22.04 下编译安装 ffmpeg 和 ffplay 一、下载源码包 1.1 官方下载链接&#xff1a;Download FFmpeg 可以手动下载&#xff0c;也可以命令行下载&#xff1a; wget http://www.ffmpeg.org/releases/ffmpeg-7.0.tar.xz 1.2 下载完解压 tar -xvf ffmpeg-7.0.tar.xz…

《深入浅出多模态》: 多模态经典模型:BLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

多个路由器连接的PC端进行ping通信需要做的事

实验环境&#xff1a; 三台PC三台路由器&#xff0c;并且配置好IP 拓扑图&#xff1a; 需求描述&#xff1a; 在PC0进行与PC2的ping通信&#xff1a; 需求步骤&#xff1a; 1.1首先配置ip&#xff08;略过&#xff09; 1.2我们首先查看在只配置了IP的情况下&#xff0c;P…

Flask中的JWT认证构建安全的用户身份验证系统

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的JWT认证&#xff1a;构建安全的用户身份验证系统 随着Web应用程序的发展&#xf…

详解IIC通信协议以及FPGA实现

一、IIC简介 IIC也称为I2C&#xff08;Inter-Integrated Circuit&#xff09;由飞利浦公司&#xff08;现在的恩智浦半导体&#xff09;开发&#xff0c;是一种用于短距离数字通信的串行&#xff0c;同步&#xff0c;半双工通信接口协议&#xff1b;传输在标准模式下可以达到10…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

代码随想录算法训练营第三十八天|509. 斐波那契数,70.爬楼梯,746. 使用最小花费爬楼梯

动态规划(DP) 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的 一、动态规划包含哪些问题&#xff1f; 1、基础问题&#xff0c;如斐波那契数 2、背包问题&#xff0c;很经典的问题 3、打家劫舍 4、…

安全开发实战(1)--Cdn

目录 安全开发专栏 CDN介绍 1.信息收集阶段 1.1判断CDN是否存在 1.1.1, One 1.1.2,Two(改进) 1.1.3,进行整合 增加输入功能 1.1.4 批量读取监测存储(进行测试) 问题1: 问题2: 解决方案: 1.1.4 基本编写完成 命令框中: cdn存在.txt 总结 这里我是根据整个渗透测…

C语言数据结构-双链表

双链表是什么 双向链表&#xff0c;又称为双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 我们…

使用mapinfo软件的在线地图插件运行错误解决

使用mapinfo软件的在线地图插件运行错误解决 一、如何解决win10/win11家庭版运行MapInfo中的在线地图插件报错【unexpected error&#xff1b;quitting】问题&#xff1f;二、如何解决在线地图切换地图源时的报错问题&#xff1f; 一、如何解决win10/win11家庭版运行MapInfo中的…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份&#xff0c;牛角源码全站数据全站文件、插件打包分享给大家&#xff0c;有兴趣的可以搭建玩玩&#xff01; conf文件夹中自己配置conf.php里面的数据库链接文件&#xff0c;默认管理账号&#xff1a;admin&#xff0c;密码&#…

代码随想录算法训练营Day60|LC84 柱状图中最大的矩形

一句话总结&#xff1a;完结撒花&#xff01; 原题链接&#xff1a;84 柱状图中最大的矩形 与接雨水的单调栈做法类似。代码如下&#xff1a; class Solution {public int largestRectangleArea(int[] heights) {int[] newHeight new int[heights.length 2];System.arrayco…

Ansible初识以及安装

1. Ansible应用简述&#xff1a; Ansible基于python语言实现&#xff0c;由Paramiko和PyYAML两个关键模块构建。具有独特的设计理念&#xff1a; 1&#xff09;安装部署简单 2&#xff09;管理主机便捷&#xff0c;支持多主机并行管理 3&#xff09;避免在被管理主机上安装客户…

SpringBoot集成Sharding-jdbc(水平分表)

SpringBoot集成Sharding-jdbc&#xff08;水平分表&#xff09; 1.Sharding-jdbc的应用场景2.实际使用2.0 项目层级2.1 导入依赖2.2 application.yml配置2.3 dao层2.4 对应的mybatis的xml文件2.5 Service层2.6 pojo2.7 controller2.8 多线程配置 1.Sharding-jdbc的应用场景 其…