当前位置: 首页 > 编程日记 > 正文

[C++]C++中的IO类

C++中的IO类

C++语言不直接处理输入输出,而是通过一组定义在标准库中的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件,控制台窗口等。还有一些类型允许内存IO,即从string读取数据,向string写入数据等。

应用程序不只从控制台窗口进行IO操作,常常需要读写命名文件,并且使用IO操作处理string的字符会很方便,所以在istream和ostream之外,标准库还定义了其他的一些IO类型,分别定义在三个独立的头文件中:iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。

类型ifstream和istringstream都继承自istream。因此我们可以像使用istream对象一样来使用ifstream和istringstream对象。需要注意的是,不能对IO对象进行拷贝或赋值,另外读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的

条件状态

IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态。一个流一旦发生错误,其后的IO操作都会失败,确定一个流对象的最简单的方法就是将他作为一个条件去使用:

while(cin>>word)

IO库定义了一个与机器无关的iostate类型,它提供了表达流状态的完整功能:
badbit表示系统级错误,如不可恢复的读写错误;failbit表示可恢复错误,如期望读取数值缺读取了一个字符;达到文件结束的位置时,eofbitfailbit都会被置位。goodbit的值为0表示未出现错误。如果badbitfailbiteofbit任意一个被置位,检测流的条件都会失败。

输出缓冲管理

每个输出流都有一个缓冲区,用于保存程序读写的数据,如下面的代码

os<<"Hello,world";

有可能直接打印也有可能被操作系统保存到缓冲区中,随后再打印。
显式刷新缓冲区的几个方法:

cout<<"Hello,world"<<endl;  //输出字符串之后输出换行然后刷新缓冲区
cout<<"Hello,world"<<flush; //输出字符串之后直接刷新缓冲区
cout<<"Hello,world"<<ends;  //输出字符串之后输出空白字符然后刷新缓冲区

当输入流关联到输出流的时候,任何试图从输入流读取数据的操作都会先刷新关联的输出流,标准库将cout和cin关联到一起,可以使用tie()函数手动将istream和ostream关联到一起。

文件输入输出

open和close函数

在定义了一个空文件流对象之后,可以调用open将其与文件关联起来

ifstream in(ifile); //构造一个ifstream并打开给定文件
ofstream out;   //输出文件流未与任何文件相关联
out.open(ifile+".copy") //打开指定文件

文件流打开之后就会保持和对应文件的关联,如果试图将这个文件流关联到另一个文件上,必须先关闭相应的文件流。

in.close(); //关闭文件
in.open(ifile+"2"); //关联到新的文件

文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件,每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用默认模式。与ifstream关联的文件默认以in模式(读方式)打开;与ofstream相关联的文件默认以out模式(写方式)打开。文件模式如下表:

  • in 以只读方式打开
  • out 以写方式打开
  • app 每次写操作前均定位到文件末尾
  • ate 打开文件后立即定义到文件末尾
  • trunc 截断文件
  • binary 以二进制进行IO

默认情况下,当打开一个ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式。

ofstream out("file1")   //文件会被清空
ofstream out("file",ofstream::app|ofstream::out)    //以app方式打开会被保存

保留ofstream打开的文件中数据的唯一办法就是指定app形式打开或者in模式打开。

string流

sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是个IO流一样。

当我们的工作是对整行文本进行处理,而其他的一些工作是处理行内的单个单词时,通常可以使用istringstream

string line,word;
vector<PersonInfo> people;
while(getline(cin,line)){   //不断从cin读取一行PersonInfo info;istringstream record(line);   //利用读取的这一行初始化record对象record>>info.name;      //从这一行中单独处理每个单词while(record>>word)info.phones.push_back(word);people.push_back(info);
}

在我们逐步构造输出,希望最后一行打印时,ostringstream非常有用。

for(const auto &entry:people){ostringstream formatted,badNums;for(const auto &nums:entry.phones){if(!valid(nums)){   //如果遇到无效电话号码,则放到badNums之后一起输出badNums<<" "<<nums;}elseformatted<<" "<<format(nums);   //将正常的电话号码都放到formatted中}if(badNums.str().empty())os<<entry.name<<" "<<formatted.str()<<endl;elsecerr<<"Input error: "<<entry.name<<" invalid number(s) "<<badNums.str()<<endl;
}

转载于:https://www.cnblogs.com/frankkk/p/9179184.html

相关文章:

solr 3.5 配置及服务器设置

一、solr 的简介 Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成&#xff0c;每个 Field 表示资源的一个属性。Solr…

【基础知识】截长图的方法以及防止截图时下拉框自动收回的方法

截长图的方法&#xff1a; 博主之前使用的tim&#xff0c;不具备截长图的功能&#xff0c;之后百度了很多的方法&#xff0c;最后发现QQ的截长图功能最好用&#xff0c;很不解&#xff0c;tim不应该是偏向于办公吗&#xff0c;这种功能竟然还能阉割&#xff1f; 使用工具&#…

IFeature接口

用于设置一个要素的属性&#xff1a; 转载于:https://www.cnblogs.com/dengshiwei/p/4258741.html

IBM公司新推一个基于云计算的Web分析工具

据外媒报道&#xff0c;IBM最新推出了一个Web分析工具&#xff0c;结合了其现有的基于B/S架构的专业数据度量和分析工具 CoreMetrics和营销分析服务Unica。IBM在去年耗资4.8亿美元收购Unica&#xff0c;帮助企业分析客户数据&#xff0c;并预测他们的需求和行 动&#xff0c;Un…

【leetcode 字符串】466. Count The Repetitions

https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandyang/p/6149294.html转载于:https://www.cnblogs.com/itcsl/p/9061427.html

TS - 处理故障的一些通用方法

本文是对解决问题的一些方法内容的改写与补充&#xff01; 首要的问题 对于发生在线上的问题&#xff0c; 最紧要的事项一定是“以最快最有效的方式解决问题&#xff0c;降低对线上业务的影响”&#xff0c;然后才是深挖问题&#xff0c;探求根本原因&#xff0c;防微杜渐&…

javascript读取XML文档

xml <?xml version"1.0" encoding"utf-8"?> <Menus> <Menu id"0" name"首页"> <MenuItemTitle sid"01" mid"0" name"常用选项"> <MenuItem mid"0" tid"0…

设计模式读书笔记-单件模式

单件模式- 确保一个类只有一个实例&#xff0c;全局只有一个入口点。 类如下: public class Singleton { private static Singleton uniqueInstance; // other useful instance variables here private Singleton() {} public static Singleton getInstance() { if (uniqueInst…

2.1 mac下多版本jdk的安装和管理

之前已经安装过jdk8了&#xff0c;安装路径&#xff1a;/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk 现在安装jdk10&#xff0c;下载后&#xff0c;双击dmg文件一直到安装完成&#xff0c;安装路径&#xff1a;/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk 安装…

python多进程详解

目录 python多进程序.multiprocessing一、Processprocess介绍例1.1&#xff1a;创建函数并将其作为单个进程例1.2&#xff1a;创建函数并将其作为多个进程例1.3&#xff1a;将进程定义为类例1.4&#xff1a;daemon程序对比结果二、Lock三、Semaphore四、Event五、Queue六、Pipe…

【工具软件】webstorm的实用快捷操作(持续积累)

博主目前正在做前端的开发&#xff0c;使用到了一个十分实用的软件叫webstom&#xff0c;昨天做了一个破解教程的博客&#xff0c;但是审核没有通过&#xff0c;有兴趣的朋友可以私信我。webstom的实用之处就在于它数不胜数的快捷操作大大简化了写代码的繁琐步骤。但是那么多的…

无线Trace脚本(旧格式)-平均延时

BEGIN {#程序初始化&#xff0c;设定一变量以记录目前处理的封包的最大ID号码。在awk环境下变量的使用不需要声明&#xff0c;直接赋值。highest_uid 0;total_packet0;total_delay_time0; } #下面大括号里面的内容会针对要进行处理的记录&#xff08;也就是我们的trace文件&am…

友元函数、类的非静态成员函数、静态成员函数的区别

类中申明的函数相对于类来说有三层意思&#xff1a;1.有this指针2.函数在类的作用区域中3.可以访问类中私有部分 4.可以被继承非静态成员函数具有1234静态成员函数具有234友元函数具有3静态成员函数与友元函数的区别只是作用区域的不同 友元函数具有全局性 不慎使用可能会造成函…

【转载】“error LNK1169: 找到一个或多个多重定义的符号”的解决方法

c的小细节的地方 原文地址&#xff1a;https://blog.csdn.net/xiaosu123/article/details/5665729 问题描述如下&#xff1a; 有 三个源文件&#xff0c;A.h、B.cpp、C.cpp。 A.h是头文件&#xff0c;其中声明了三个变量a1、a2、 a3。 B.cpp是A.h中所声明的类的实现源代码&…

【jQuery】jQuery知识点梳理(持续更新)

jQuery是什么&#xff1a; 由图标可知&#xff1a; j&#xff1a;JavaScript query&#xff1a;查询 所以可以分析得jQuery是一个JavaScript库&#xff0c;而且主要用来查询。 注意&#xff0c;下面的一行小字&#xff0c;write less do more 我们不仅可以看出jQuery以高效…

Python - 在CentOS7.5系统中安装Python3

注意&#xff1a;以下内容均使用root用户执行操作。 1-确认信息 # uname -a Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux # # cat /etc/system-release CentOS Linux release 7.5.1804 (Core) # …

JQuery 基础:8.节点操作

1.replaceWith替换节点 $("br").replaceWith("<hr/>"); 2.wrap()包裹节点,将元素逐个用指定标签包裹 $("b").wrap("<font colorred></font>")转载于:https://www.cnblogs.com/xyangs/archive/2012/05/22/2513821.ht…

《CLR Via C# 第3版》笔记之(十四) - 泛型高级

为了更好的利用泛型&#xff0c;现将泛型的一些高级特性总结一下。 主要内容&#xff1a; 泛型的协变和逆变泛型的参数的约束1. 泛型的协变和逆变 对于泛型参数(一般用T表示)&#xff0c;指定了类型之后。就只能识别此类型&#xff0c;面向对象中的继承并不适用泛型参数&#x…

剑指offer-反转链表

输入一个链表&#xff0c;反转链表后&#xff0c;输出链表的所有元素。 #-*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val x # self.next None class Solution:# 返回ListNodedef ReverseList(self, pHead):# write code h…

[NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)

达哥送分给我我都不要&#xff0c;感觉自己挺牛批。 $type0:$ 跟visit那题类似&#xff0c;枚举横向移动的步数直接推公式&#xff1a; $ans\sum C_n^i \times C_i^{\frac{i}{2}} \times C_{n-i}^{\frac{n-i}{2}},i\% 20$ $type1:$ 因为不能触碰负半轴&#xff0c;所以可以把右…

如何获取元素最终使用的css值

这个问题是在组件css加载方案中碰到的 场景&#xff1a; 元素的样式我们可以写在style里面&#xff0c;也可以写到外链css里面&#xff0c;如果没有设置&#xff0c;也会读取浏览器默认的css的&#xff0c;现在我们要计算getComputedstyle某个元素的最终所使用的css样式 区别&a…

【工具软件】webstorm如何使用快捷键生成固定代码

我们写前端页面时会有很多的机械重复代码&#xff0c;每写一个文件都要重新写一遍&#xff0c;枯燥且浪费时间&#xff0c;有没有一个方法可以快速生成这些代码呢&#xff1f;有&#xff01;webstorm替我们考虑到了这个问题&#xff0c;提供了解决方案&#xff0c;接下来让我们…

Citrix Receiver For Linux 预览版

Citrix各平台的客户端插件都在不断的完善和进行版本升级&#xff0c;但是For linux版本的ICA Client基本是一成不变&#xff0c;很长时间都不会有什么动静&#xff0c;但是Citrix产品都是搭配ThinClient来使用&#xff0c;而好多ThinClient都会使用Linux系统&#xff0c;而在Li…

5.20 单词小记

1.cart n. 二轮运货马车 vt. 用车装载 vi. 驾运货马车&#xff1b;用运货车运送 网络释义:购物车,小车,球车,分类与回归树 例:This would allow the server application to identify the cart from which it should add and removeitems. 这将使服务器应用程序能够确定它所应该…

windows性能计数器搜集方法

windows性能计数器搜集方法 PerfMon-Windows性能监视器是个好东西&#xff0c;可以辅助我们分析发生问题时间段服务器资源占用情况&#xff0c;但是部署性能计数器确实一个相当麻烦的事情&#xff0c;往往这种枯燥的事别人还做不了&#xff0c;只能由我们这些希望获取到PerfMon…

【HDU】3308 LCIS

1 #include<cstdio>2 #define MAXN 1000103 struct node4 {5 int left,right,val;6 };7 int a[MAXN];8 node tree[MAXN<<2];9 inline int MAX(int x,int y) 10 { 11 return x>y?x:y; 12 } 13 inline int MIN(int x,int y) 14 { 15 return x>y?…

【基础知识】如何在浏览器中查找元素属性节点

首先&#xff0c;什么是属性节点&#xff1f;属性节点是在编写html代码时&#xff0c;在html标签中添加的属性。 本文重点&#xff1a;如果您用的ie&#xff0c;我恳请您不要在用了&#xff0c;你们的每次使用都是打在前端工程师身上的一发子弹 代码实例&#xff1a; <!DOC…

C#系列五《多样化的程序分支》

上一篇介绍了C#程序设计分支的基本概念与基本操作&#xff0c;这篇的主题是高级的程序分支&#xff0c;例如&#xff1a;分支的嵌套与分支是使用的场景&#xff01;与三元运算符(&#xff1f;:),废话少说还是开始吧&#xff01; 1.三元运算符【&#xff1f;:】 三元运算符分为三…

Vue报错:Uncaught RangeError: Maximum call stack size exceeded

vue项目放在服务器上&#xff0c;报错如下&#xff1a; 堆栈溢出&#xff1a; 1、原因&#xff1a;有小类到大类的递归查询导致溢出 2、解决方法思想&#xff1a; A、在做递归查询时候由大类到小类去查询 B、匹配结果后及时return 退出&#xff0c;防止过多查询 转载于:https:/…