C++ primer摘要(6)---IO

IO库

  • IO库设施
- [x] istream(输入流)类型,提供输入操作
- [x] ostream(输出流)类型,提供输出操作
- [x] cin,一个istream对象,从标准输入读取数据
- [x] cout,一个ostream对象,向标准输出写入数据
- [x] cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
- [x] >>运算符,用来从一个istream对象读取输入数据
- [x] <<运算符,用来向一个ostream对象写入输出数据
- [x] getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中

IO类

管理输出缓冲
  • 缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作
  • 由于设备的写操作可能会很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升
  • 导致缓冲刷新(即数据真正写到输出设备或文件)的原因有如下几个:
- [x] 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
- [x] 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
- [x] 可以使用操作符endl来显式刷新缓冲区
- [x] 在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来情况缓冲区,默认情况下,对cerr是设置unitbuf的,因此写道cerr的内容是立即刷新的
- [x] 一个输出流可能被关联到另一个流,在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新,例如,默认情况下,cin和cerr都关联到cout,因此,读cin或写cerr都会导致cout的缓冲区被刷新
  • 刷新输出缓冲区
- [x] 操纵符`endl`,`flush`以及`ends`可以刷新缓冲区
cout<<"hi!"<<endl;      //输出hi和一个换行符,然后刷新缓冲区
cout<<"hi!"<<flush;     //输出hi,然后刷新缓冲区,不附加任何额外字符
cout<<"hi!"<<ends;      //输出hi和一个空字符,然后刷新缓冲区
  • unitbuf操纵符
- [x] 如果想在每次输出操作之后都刷新缓冲区,我们可以使用unitbuf操纵符,它告诉流在接下来的每次写操作之后进行一次flush操作,而nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
cout << unitbuf;        //所有输出操作后都会立即刷新缓冲区
cout << nounitbuf;      //回到正常的缓冲方式
  • 如果程序崩溃,输出缓冲区不会被刷新

文件输入输出

  • 头文件fstream定义了三个类型来支持文件的IO操作
- [x] ifstream,从一个给定文件读取数据
- [x] ofstream,向一个给定文件写入数据
- [x] fstream,可以读写给定文件
使用文件流对象
  • read函数
ifstream input(strInFile);
ofstream output(strOutFile);    
Sales_data total;               
read(input,total);   
//通过ifstream将数据读取到total
  • 一旦一个文件流已经打开,它就保持与对应文件的关联,在关联关闭之前,无法被其他文件流关联
  • 当一个fstream对象被销毁时,close会自动调用
文件模式
  • 每一个流都有一个关联的文件模式,用来指出如何使用文件
in          以读方式打开
out         以写方式打开
app         每次写操作前定位到文件末尾
ate         打开文件后立即定位到文件末尾
trunc       截断文件
binary      以二进制方式进行IO操作
  • 无论哪种方式打开文件,都可以指定文件模式,调用open打开文件时可以,用一个文件名初始化流来隐式打开文件时也可以
  • 以out模式打开文件会丢弃已有数据
- [x] 默认情况下,当我们打开一个ofstream时,文件的内容会被丢弃
- [x] 保留被ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式
  • 每次调用open时都会确定文件模式
- [x] 在每次打开文件时,都要设置文件模式,可能是显式的设置,也可能是隐式的设置,当程序未指定模式时,就是用默认值

string流

  • sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样
- [x] `istringstream`从string读取数据
- [x] `ostringstream`向string写入数据
- [x] `stringstream`既可以从string读取数据也可以向string写入数据
  • fstream类型类似,头文件sstream中定义的类型都继承自iostream头文件中定义的类型
istringstream使用
  • 当需要对整行文本进行处理,而其他一些工作是处理行内单个单词时,通常使用istringstream
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357