c++中的基本IO
引言
c++不直接处理输入和输出,而是通过标准库中的类型处理IO。IO的设备可以是文件、控制台、string。c++主要定义了三种IO类型,分别被包含在iostream、fstream、sstream头文件中。
为了支持使用宽字符的语言,标准库定义了一组类型和对象操纵wchar_t类型的数据。
以下是这三种IO库类型以及头文件:
- iostream头文件
- istream(宽字符版本wistream),从流读取数据。
- ostream (宽字符版本wostream),向流写入数据。
- iostream(宽字符版本wiostream),读写流。
- fstream头文件
- ifstream(宽字符版本wifstream),从文件读取数据。
- ofstream (宽字符版本wofstream),向文件写入数据。
- fstream(宽字符版本wfstream),读写文件。
- sstream头文件
- istringstream(宽字符版本wistringstream),从string读取数据。
- ostringstream (宽字符版本wostringstream),向string写入数据。
- stringstream(宽字符版本wstringstream),读写string。
设备类型和字符大小不会影响我们要执行的IO操作。得益于继承机制,以上类型都可以使用>>、<<运算符以及getline()函数。
IO类型的通用特性
IO对象不能拷贝或赋值
istream is1,is2;
is1 = is2; //错误,流对象不能赋值
istream is3(is1); //错误,流对象不能拷贝
由于无法拷贝IO对象,因此不能将形参或返回类型设置为流类型。通常使用引用方式传递和返回流。但传递和返回的引用不能是const的,因为读写IO对象会改变IO对象的状态,也就是改变了IO对象。
IO对象的状态信息
IO类定义了一些函数和标志位,帮助我们检查和操纵流的状态:
strm::iostate是一种类型,这种类型就像一串二进制位串,每个二进制位串指出了流的状态。(strm为引言中的任意一种IO类型)。eof()函数用于在IO对象上调用,如cin.eof()。如果流检测到eof(文件结束标志),该函数返回true。fail()函数使用同上。如果流处于崩溃或IO操作失败的状态,返回true。bad()函数使用同上。如果流处于崩溃状态,返回true。good()函数使用同上。如果流处于有效状态,返回true。clear()函数使用同上。将IO对象中的所有条件状态为复位,流的状态变为有效状态,返回void。setstate(flags),将IO对象的状态为按flags(类型为strm::iostate)指示的那样置位。rdstate()函数用于在IO对象上调用,读取IO对象的状态位,返回类型为strm::iostate。
一旦流发生错误,这个流上的后续IO操作都会失败,因此最好在使用流之前检查它是否处于良好状态。如
// 如果输入成功,流保持有效状态,条件为真
while(cin >> word){
//读操作成功,其他操作。
}
输出缓冲
所有输出流都管理一个缓冲区,用来保存程序读写的数据。
cout << "Hello World!";
串"Hello World!"可能被立即打印出来,也可能被操作系统保存在缓冲区,随后打印。
以下原因可以刷新缓冲(即真正将数据输出到目标设备或文件中):
- 程序正常结束,自动刷新。
- 缓冲区满时,自动刷新。
- 可以使用操作符
endl、flush、ends手动刷新缓冲区(只作用一次输出)。
cout << "1" << endl; //字符串后添加换行,然后刷新缓冲区
cout << "2" << flush; //仅刷新缓冲区
cout << "3" << ends; //字符串后添加一个空字符,然后刷新缓冲区。
- 通过操作符unitbuf设置自动刷新。不同于
endl、flush、ends只作用于一次输出,设置了unitbuf后的输出流每输出一次都会自动刷新缓冲区。
cout << unitbuf;//下面的语句每执行一次输出,就刷新一次缓冲区。
cout << "1"; //输出"1",自动刷新缓冲区
cout << "2"; //输出"2",自动刷新缓冲区
cout << "3"; //输出"3",自动刷新缓冲区
cout << "4"; //输出"4",自动刷新缓冲区
...
cout << "nounitbuf"; //回到流默认的缓冲方式
- 关联流。读写被关联的流时,关联到的流的缓冲区会被刷新(
tie()函数括号里面的是关联到的流,调用tie()的流是被关联的流)。cout 和 cin默认关联在一起,使用cin读取数据时,cout的缓冲区被刷新。
cout << "Fuck you!"; //没有指定操作符,cout默认不刷新,该语句执行完后"Fuck you!"可能立即被输出到屏幕,也可能稍后被输出。
int i;
cin >> i; //cout的缓冲区被刷新,此时"Fuck you!"一定已经真正输出(可能在之前就已经真正输出,此时刷新缓冲区等于什么都没做)。
使用tie()函数关联流和解除关联:
cin.tie(&cout); //有参数的tie(),参数为指向流的指针,且指针不为空,此时建立关联。
cin.tie(nullptr); //有参数的tie(),且指针为空,此时解除cin和其他流的关联。
cin.tie(); //无参tie(),返回指向cin当前关联到的流的指针。
Note:
若程序崩溃即异常终止,输出缓冲区不会被刷新,换言之,缓冲区中的数据可能并没有真正被输出到文件或设备。
文件IO
创建文件流
前面所过,所有IO类型都可以使用>>、 <<与getline(),除此之外,文件IO还有一些特有的操作。
创建文件流:
fstream fstrm1; //创建未绑定文件的文件流
fstream fstrm2(s1); //创建绑定到指定文件s1的文件流(自动调用open())。s1是string或指向c风格字符串的指针。
//fstream fstrm3(s2, mode); 与第二条语句类似,但指定打开文件的模式。
Note:
当一个fstream的作用域内的代码执行完毕,fstream关联的文件被自动关闭,即fstream对象被销毁时,close()会自动调用。
open和close
使用open打开文件,close关闭文件。对一个已经打开的文件调用open会失败,并且failbit被置位。
string file1 = "qq.dat";
ifstream ifs;
ifs.open(file1);
//读取操作
ifs.close();
文件模式mode
常用的文件模式mode如下:
- in 只读方式打开文件
- out 以写方式打开文件
- app 每次写操作在文件末尾进行
- ate 打开文件后立即定位到文件末尾
- trunc 截断文件,即输出会覆盖文件中的原有数据。
- binary 以二进制方式打开文件
同时指定多个模式时使用|分隔:
ofstream ofs("file1", ofstream::out | ofstream::app);
Note:
out模式隐含trunc即覆盖原文件,若要在原文件末尾添加数据,则需要显式指明app模式。若没有指定任何模式,则使用默认模式。
string IO
stringstream独有的操作如下:
sstream strm; //sstream为sstream头文件中定义的类型,具体可以是istringstream等。
sstream strm(s); //建立一个sstream对象,保存字符串s的一个拷贝。
strm.str(); //返回strm保存的string的拷贝。
strm.str(s); //将string s拷贝到strm。
声明:
c++ Basic是对《C++ Primer 第五版》的个人总结与疑难解释,主要用于个人日后复习。
如果想要深入了解更多,请支持正版。
c++中的基本IO的更多相关文章
- Pipelines - .NET中的新IO API指引(三) 边看边记
Pipelines - .NET中的新IO API指引 作者 marcgravell 原文 此系列前两篇网上已有的译文 Pipelines - .NET中的新IO API指引(一) Pipeline ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- 【译】对Rust中的std::io::Error的研究
原文标题:Study of std::io::Error 原文链接:https://matklad.github.io/2020/10/15/study-of-std-io-error.html 公众 ...
- Java中 NIO与IO的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- 在linux系统中跟踪高IO等待
原文作者:Jon Buys 原文地址:http://ostatic.com/blog/tracking-down-high-io-wait-in-linux 译者:Younger Liu,本作品采用知 ...
- Java中NIO和IO区别和适用场景
NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道.管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征. 概念解释: ...
- elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接
[2018-07-31T14:29:41,289][WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [9rTGh-y] caught exc ...
- Java中常见的IO流及其使用
Java中IO流分成两大类,一种是输入流.全部的输入流都直接或间接继承自InputStream抽象类,输入流作为数据的来源.我们能够通过输入流的read方法读取字节数据.还有一种是输出流,全部的输出流 ...
- node中的socket.io制作命名空间
如果开发者想在一个特定的应用程序中完全控制消息与事件的发送,只需要使用一个默认的"/"命名空间就足够了.但是如果开发者需要将应用程序作为第三方服务提供给其他应用程序,则需要为一个用 ...
- 快速入门Python中文件读写IO是如何来操作外部数据的?
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
随机推荐
- TensorRT Analysis Report分析报告
TensorRT Analysis Report 一.介绍 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可 ...
- 简化可视SLAM应用程序的开发
简化可视SLAM应用程序的开发 Easing the development of visual SLAM applications 同步定位和映射(SLAM)描述了一个设备(如机器人)使用传感器数据 ...
- 作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?
前言 对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一.因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存.CPU.操作系统.编程语言等多方面的基础能力,更 ...
- 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例
Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...
- 手把手教你彻底理解MySQL的explain关键字
数据库是程序员必备的一项基本技能,基本每次面试必问.对于刚出校门的程序员,你只要学会如何使用就行了,但越往后工作越发现,仅仅会写sql语句是万万不行的.写出的sql,如果性能不好,达不到要求,可能会阻 ...
- 【工具解析】瑞士军刀bettercap2.X解析_第一期_编写HTTP代理注入模块_http(s).proxy.script
/文章作者:Kali_MG1937 CNBLOG博客号:ALDYS4 QQ:3496925334/ 前言 bettercap已经从1.6更新至2.0版本 语言也从ruby改为了go 编写注入模块指定的 ...
- 常用的16个Java实用工具类,Java开发人员请收藏!
在Java中,实用程序类是一个定义一组执行常用功能的方法的类.这篇文章展示了最常用的Java实用程序类及其最常用的方法.类列表及其方法列表都按流行度排序.该数据基于GitHub随机选择的50,000个 ...
- Java-Java8特性(更新中)
Java8新特性 之前零零散散写了很多java8的内容,今天做一个整理,也算是整理用到的内容,当然细化的话还有很多,只是说暂时用不到,为了面试的话已经够了 日期计算 Lambda表达式 函数式接口(比 ...
- Go语言中的有缓冲channel和无缓冲channel区别
Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...
- 第三方API对接如何设计接口认证?
一.前言 在与第三方系统做接口对接时,往往需要考虑接口的安全性问题,本文主要分享几个常见的系统之间做接口对接时的认证方案. 二.认证方案 例如订单下单后通过 延时任务 对接 物流系统 这种 异步 的场 ...