6.7 输入输出流

输入:将数据放到程序(内存)中

输出:将数据从程序(内存)放到设备中

C++的输入输出分为3种形式:

从键盘屏幕中输入输出,称为标准IO

对于磁盘进行标准输入输出,称为文件IO

对于指定的空间进行输入输出字符串,称为串IO

cin是通用输入流的对象。

标准IO没有进行特别的规定,比较特殊和常用没有定义额外的类。

其他的输入输出流有专门定义了的类。

通用输入输出包含文件标准字符串输入输出

流的四种状态

badbit:系统错误,置位时流无法使用

failbit:可恢复的错误,想读一个int但读成了char,修改后流正常使用

eofbit:到达文件末尾,置位

goodbit:表示流是一个有效状态

当处于前三种状态时无法正常使用,但是重点关注第二种

标准输入输出

标准输入输出是在iostream这个类中,cin其实是其中的一个对象

在iostream这个类中有成员函数good()。。。

clear()调整为流的状态为goodbit,但是因为输入是字符串但是读入进行存储的地方是int类型,所以没有能够清空这个输入的缓冲区,所以需要将缓冲区进行清空。所以说clear调整流的状态需要和ignore函数结合使用,ignore默认是忽略1个字符,不要忘记忽略最后的换行符,所以说需要设置足够的可以忽略的字符数ignore(4)用来忽略you\n。这样很麻烦不确定会输入什么。

可以通过补充功能实现cin.ignore(12,'\n');

这样最多释放12个字符,不管到不到最大值字符数,直到分隔符都忽略。

所以可以设置为cin.ignore(1024,'\n');所以前面参数可以尽可能设置更大。

如果觉得还不够大使用

#include <limits>头文件中的最大数值
input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

//记住这个前面是一个类,其中是定义的静态函数,

使用这个定义的最大的数值

下面的这个情景:当输入错误的时候,要求继续进行输入

int x;
cout << "输入:" << endl;
//,表达式依据最后的表达式,cin会执行,但是不会让while直接结束
int number = 0;
while(cin << x,++number,!cin.eof()){if(number > 5){cout << "输错超过5次" << endl;break;}if(cin.bad()){cout << "不可补救" << endl;return 0;}else if(cin.fail()){cin.clear();cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');cout << "输入正确的格式" << endl;}else{//正确cout << "right" << endl;break;}
}//asdf3后面的数字被认为是字符串的一部分,是错误的
//2sadf后面的字母并不会被读出来,留在缓冲区中,这个输入是正确的

对于流的状态进行判断的时候可以直接判断

if(cin.good()){}

if(cin){}

是同样的效果,都可以继续进行任务。

//所以说可以这样来使用
if(cin >> num){cout << "right !" << endl;
}

连续cin或者是cout

int a,b;
cin >> a >> b;
(cin >> a )>> b;
//两个是一样的效果
//cin语句表达式的返回值就是cin或者cout对象
如果说a输入格式不对的话,b就不会再允许进行输入

连续的输入可以通过换行来实现也可以通过空格来实现

缓冲机制

(内存)用于缓解cpu(程序)和磁盘(IO操作)的速度的差距

输入内容存在流缓冲区中,特定情况下释放

缓冲机制:

三种缓冲机制:全缓冲(填满缓冲区),行缓冲(填满一行),不缓冲

cin:全缓冲和行缓冲(换行的时候就将数据放在对应的变量)

cout:满缓冲

通过下面的例子理解:会先打印1024个a,2秒以后又打印一个a。

实际上如果是打印1500,也是会先打印1024个,然后正序结束的时候剩下的才打印。

gcc默认的缓冲区大小是1024,缓冲区满了以后先打印出来然后剩下的放在缓冲区中。

如果遇到endl就会直接刷新打印出来,或者是fflush。(endl底层实际上是刷新+换行)

1024刚好放下不会打印,2秒后打印。

无缓冲:不管来啥直接就打印出来

cerr打印错误的时候,不会使用到缓冲区,直接就打印出来,因为比较紧急。

文件输入和输出流

ifstream();
explicit ifstream(const char* filename, openmode mode = ios_base::in);
explicit ifstream(const string & filename, openmode mode = ios_base::in);ofstream();
explicit ofstream(const char* filename, openmode mode = ios_base::out);
explicit ofstream(const string & filename, openmode mode = ios_base::out);fstream();
explicit fstream(const char* filename, openmode mode = ios_base::in|out);
explicit fstream(const string & filename, openmode mode = ios_base::in|out);

还得需要注意哪个是输入,哪个是输出。外存文件到程序是输入,就像是cin从将键盘到内存程序

【补充】Point pt = 1; pt.print(); 这是一种隐式转换,pt就是(1,0)。但是这种格式非常的奇特,所以说采用explicit禁止这种情况

String str = "hello";

其实这也是一个隐式转换,这种隐式转换就比较正常,所以说不使用explict禁止

文件输入流

#include <fstream>
void test0(){ifstream ifs;ifs.open("test1.cc");ifstream ifs2("test2.cc");string filename = "test3.cc";ifstream ifs3(filename);
}
//第二个参数有默认值

无参构造的时候借助于open将创建的文件输入流与文件进行绑定,文件不存在的时候流的状态变为failbit状态,这个时候添加一个判断语句。

ifstream ifs;
if(!ifs){cout << "file is not exist! " << endl;return;
}

通过上一部分可以知道可以在一开始的时候就和文件进行绑定,也可以一开始使用无参构造,然后

使用open函数与文件进行绑定。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main()
{ifstream ifs;ifs.open("string.cc");if(!ifs){cerr << "file error" << endl;return ;}    //1.c风格字符串不常用char buf[100];while(ifs.getline(buf, sizeof(buf))){cout << buf << endl;memset(buf, 0, sizeof(buf));//c风格字符串记得清0不像c++可以自己处理空间且不用清理}//2.C++风格string line;while(getline(ifs,line)){cout << line << endl; }cout << endl;return 0;
}

第二种c++风格中的getline函数是用到istream中的getline成员函数,ifstream是istream的派生类。

读取指定字节数的内容

read函数 + seekg函数 + tellg函数

seekg用来设置游标的位置,tellg用来获取游标的位置

seekg有两种方式可以进行位置的获取,一种是绝对位置的设置另外一种是相对位置的设置方式

(1)seekg(30)偏移到第30个位置 (2)seekg(0, std::ios::end)

打开的时候就立即让游标移到末尾的位置

重要读取配置文件的时候会使用到,文件的io

文件输出流

#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main()
{ofstream ofs("1.txt", std::ios::app);if(!ofs){cerr << "file error " << endl;return 0;                        } string str("hello");ofs << str;ofs.close();return 0;
}

打开ofstream的时候使用参数app的方式打开的话,就会追加的方式打开。

下面这种方式就是可以在另外的一个窗口中动态的查看文件的内容。

【注意】文件不存在时候不会报错,会创建文件,不像读入文件一样

字符串输入输出流

字符串输入流

#include <iostream>
#include <sstream>
#include <string>using namespace std;
int main()
{string str = "22313                12"; int num1, num2;istringstream iss(str);iss >> num1 >> num2;cout << num1 << "     " << num2 << endl;return 0;
}

这样num1和num2就被赋初值。

这样就非常方便去读配置文件

【注意】注意一个一个小细节就是使用const引用,可以避免修改和复制以及可能会绑定右值问题

#include <iostream>                   
#include <fstream>
#include <sstream>
#include <string>   using namespace std;int main()
{ifstream ifs("my.conf");if(!ifs){cerr << "file error" << endl;return 0;}string line;while(getline(ifs, line)){istringstream iss(line);string temp, use;iss >> temp >> use;cout << temp << ": " << use;/* iss.close(); */}ifs.close();return 0;
}

读取配置文件的过程:

通过ifstream打开文件,一次读取出来一行。

通过istringstream将一行赋给字符串输入流,实际上就是建立一个缓冲区,然后自己通过空格挨个读取出来

【注意】这个地方其实就是实现了类型的转换从string类型转换为int类型

【补充】

cout cin cerr都是对象

endl是inline函数

std::string  std::isatream 是一个类

字符串输出流

void test0(){int num = 123, num2 = 456;ostringstream oss;//把所有的内容都传给了字符串输出流对象oss << "num = " << num << " , num2 = " << num2 << endl;cout << oss.str() << endl;
}

就是将一长串任何类型的数据转换为一个string类型的数据

string可以直接用+,也可以用append,但是这两种不能跨类型实现不能string str = "hello" + 2;

可以通过std::to_string(1)变为string类型的数据。

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

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

相关文章

第5章 if语句

第5章 if语句 5.1 示例5.2 条件测试5.2.1 检查是否相等5.2.2 检查是否相等时忽略大小写5.2.3 检查是否不相等5.2.4 数值比较5.2.5 检查多个条件5.2.6 检查特定值是否包含在列表中5.2.7 检查特定值是否不包含在列表中5.2.8 布尔表达式 5.3 if 语句5.3.1 简单的if 语句5.3.2 if-e…

硕思闪客精灵(shankejingling)软件最新版下载及详细安装教程

闪客精灵&#xff08;Sothink SWF Decompiler&#xff09;是一款先进的SWF反编译软件&#xff0c;它不但能捕捉、反编译、查看和提取Shock Wave Flash影片&#xff08;.swf和.exe格式文件&#xff09;&#xff0c;而且可以将SWF格式文件转化为FLA格式文件。它能反编译Flash的所…

四天工作制,比你想象的更近了一点

原文&#xff1a;Andrew Keshner - 2024.05.30 软件公司、大型企业甚至警察部门都在试验这一看似遥不可及的概念。 教育软件公司 Kuali 的会议精简&#xff0c;除非绝对必要&#xff0c;员工尽量避免安排会议。即使有会议&#xff0c;也鼓励员工跳过与自己工作无关的部分。在…

从技术到产品:以客户为中心的产品研发之路

一、引言 在快速发展的商业环境中&#xff0c;产品作为连接企业与市场的桥梁&#xff0c;其重要性不言而喻。从摸着石头过河搞产品&#xff0c;到广泛传播NPDP&#xff08;新产品开发流程&#xff09;理念&#xff0c;产品研发的道路经历了从直觉驱动到系统思维的转变。本文将…

ArcGIS for js 4.x 加载图层

二维&#xff1a; 1、创建vue项目 npm create vitelatest 2、安装ArcGIS JS API依赖包 npm install arcgis/core 3、引入ArcGIS API for JavaScript模块 <script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from arcgis…

哈希桶封装unordered_map、unordered_set

哈希桶源代码 我们将由下列的哈希桶来模拟封装STL库中的unordered_map和unordered_set 注意&#xff1a;为了实现封装unordered_map和unordered_set&#xff0c;我们需要对下列源码进行优化。 //哈希桶 namespace hashbucket {template<class K,class V>struct HashNo…

高考作文:时光之河,逐梦前行

时光之河&#xff0c;奔流不息&#xff0c;如同我们的人生旅途&#xff0c;充满了未知与挑战。站在2024年的高考门槛前&#xff0c;我们回望过去&#xff0c;展望未来&#xff0c;心中充满了期待与憧憬。 首先&#xff0c;让我们回顾一下这条时光之河中的点滴。过去的岁月里&am…

区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

针对业务系统的主备容灾实战原理-基础版

1、前言 本文主要在于介绍&#xff1a;通过系统的实时容灾功能模块&#xff0c;针对用户云计算中关键业务系统的主备容灾方案原理。 涉及到的技术能力、运维能力要求偏高&#xff0c;遂本文尽量将容灾原理讲解清楚。需要用到的云计算能力包括&#xff1a;计算机操作系统(Linu…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展&#xff0c;包括无人机、卫星等&#xff0c;红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像&#xff0c;红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来&#xff0c;深度学习作为一种强大的图像处理技术&#xff0…

问题:下列可以作为机组投运凝结水精处理系统的指标为()。 #学习方法#经验分享#微信

问题&#xff1a;下列可以作为机组投运凝结水精处理系统的指标为&#xff08;&#xff09;。 A.启动分离器出水含铁量小于1000ug/L B.启动分离器出水含铁量大于1000ug/L C.启动分离器出水含铁量等于1000ug/L D.以上都不是 参考答案如图所示

PowerDesigner遍历导出所有表结构到Excel

PowerDesigner遍历导出所有表到Excel 1.打开需要导出表结构到Excel的pdm文件 2.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口&#xff0c;输入示例VBScript脚本&#xff0c;修改其中的Excel模板路径及工作薄页签&#xff0c;点Run…

Edge浏览器十大常见问题,一次性解决!

Edge曾被称为最好用的浏览器&#xff0c;拳打Chrome脚踢firefox, 可如今却隐藏着像是播放卡顿、下载缓慢、广告繁多等诸多问题&#xff0c;不知道各位还在用吗&#xff1f; 今天小编收集整理了Edge浏览器十大烦人问题&#xff0c;并提供简单有效的解决办法&#xff0c;让你的E…

springboot+websocket+vue聊天室

目录 一、项目实现内容二、websocket三、实现过程java后端vue前端源代码 WebSocketServer调用spring容器注意事项扩展 一、项目实现内容 http://localhost:8080/websocket?uid1 http://localhost:8080/websocket?uid2 http://localhost:8080/websocket?uid3 二、websocket …

crossover软件安装程序怎么安装 Crossover for Mac切换Windows系统 crossover软件怎么样

CrossOver Mac版是专为苹果电脑用户打造的一款实用工具&#xff0c;这款工具主要方便用户在Mac上运行windows系列的应用程序&#xff0c;用户不需要安装虚拟机就可以实现各种应用程序的直接应用&#xff0c;并且可以实现无缝集成&#xff0c;实现跨平台的复制粘贴和文件互通等&…

YOLOv10开源,高效轻量实时端到端目标检测新标准,速度提升46%

前言 实时目标检测在自动驾驶、机器人导航、物体追踪等领域应用广泛&#xff0c;近年来&#xff0c;YOLO 系列模型凭借其高效的性能和实时性&#xff0c;成为了该领域的主流方法。但传统的 YOLO 模型通常采用非极大值抑制 (NMS) 进行后处理&#xff0c;这会增加推理延迟&#…

【经验分享】不同内网服务器之间利用webdav互传文件

目录 0、前言1、授权webdav应用2、下载webdavclient33、替换相关代码 0、前言 最近&#xff0c;我在处理两台服务器间的文件传输问题时遇到了不少难题。这两台服务器并不处于同一内网环境&#xff0c;导致无法通过SFTP进行文件传输。由于这些服务器属于局域网&#xff0c;并且…

高效文件传输攻略:利用局域网共享实现极速数据同步

最近&#xff0c;我换了一台新电脑&#xff0c;面对两个电脑之间文件备份和传输的问题&#xff0c;感到十分头疼。经过多方了解&#xff0c;我发现可以在原电脑上设置共享文件&#xff0c;然后接收方从共享文件中接受即可&#xff0c;这样可以将局域网的带宽拉满&#xff0c;比…

✔️Vue基础+

✔️Vue基础 文章目录 ✔️Vue基础computed methods watchcomputed计算属性methods计算属性computed计算属性 VS methods方法计算属性的完整写法 watch侦听器&#xff08;监视器&#xff09;watch侦听器 Vue生命周期Vue生命周期钩子 工程化开发和脚手架脚手架Vue CLI 项目目录介…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:隧道和矿井绘图设备

RockMass 正在努力打入采矿业和隧道工程利基市场。 这家位于多伦多的初创公司正在利用 NVIDIA AI 开发一款绘图平台&#xff0c;帮助工程师评估矿井和施工中的隧道稳定性。 目前&#xff0c;作为安全预防措施&#xff0c;地质学家和工程师会站在离岩石五米远的地方&#xff0…