前言

基本的IO库设施

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

IO类

三种最常用的IO头文件

  • iostream头文件定义了 控制台读写流的基本类型。
  • fstream定义了读写命名文件的类型。
  • sstream定义了读写内存string对象的类型。

IO对象不能拷贝复制

  1. ofstream out1,out2;
  2. out1 = out2; //报错,不能对流对象复制
  3. ofstream print(ofstream); //错误,不能初始化ofstream参数
  4. out2 = print(out2); //错误,不能拷贝流对象

流的条件状态

  1. ostream s;
  2. bool istrue;
  3. istrue = s.eof(); //流到达文件末尾则为true
  4. istrue = s.fail(); //IO失败则为true
  5. istrue = s.bad(); //流崩溃则为true
  6. istrue = s.good(); //流处于有效状态则返回true
  7. s.clear(); //将所有状态复位,流的状态重置为有效状态
  8. s.clear(flags); //根据指定的flags标志位将流s的对应条件状态位复位
  9. s.setstate(flags); //根据给定的flags标志位,将流s的对应条件状态位置位
  10. s.rdstate(); //返回流的当前状态

管理输出缓冲

缓冲刷新(数据真正地写到输出设备和文件中)的触发机制

  • 程序正常结束,main函数return。
  • 缓冲区满,需要刷新缓冲区。
  • 使用诸如endl(换行)、flush(不附加字符)、ends(附加一个空字符)等操作符显式地刷新缓冲区。
  • 关联输入和输出流。当读写被关联的流时,关联到流的缓冲区会被刷新。如默认情况下,cerr和cin都关联到cout,因此读cin或者写cerr时都会导致cout的缓冲区被刷新。

关联输入输出流

x.tie(&o)的形式,即将流x关联到流o。

  1. cin.tie(&cout); //展示用,标准库默认将二者绑定
  2. ostream *old_tie = cin.tie(nullptr); //cin不再与其他流关联
  3. cin.tie(&cerr) //将cin与cerr关联
  4. cin.tie(old_tie) //重建cin和cout的正常关联

文件输入输出流

三种类型:ifstream从指定文件读取数据,ofstream负责写入数据,而fstream可以读写文件。

  1. //
  2. string filepath;
  3. fstream fs(filepath); //创建一个fstream文件流并打开filepath的文件。
  4.  
  5. //2.或者
  6. fstream fs(filepath,mode); //按指定模式打开文件
  7. /*模式
  8. in 以读方式打开,ifstream和ftream的默认模式
  9. out 以写的方式打开,ofstream和fstream的默认模式
  10. app 每次写操作前均定位到文件末尾
  11. ate 打开文件立即后立即定位到文件末尾
  12. trunc 截断文件
  13. binary 以二进制的形式进行IO
  14. */
  15.  
  16. //3.又或者
  17. fstream fs;
  18. fs.open(filepath);
  19.  
  20. fs.close();//关闭与fs绑定的文件
  21. fs.is_open(); //返回bool值,指出与fs关联的文件是否成功打开且尚未关闭

自动构造和析构

当一个fstream对象呗销毁时,close函数会被自动调用,如下

  1. for(auto p = argv + ; p != argv + argc;++p)
  2. {
  3. ifstream input(*p); //创建输入流并打开文件
  4. if(input) //成功打开
  5. {
  6. process(input); //处理文件
  7. }
  8. else
  9. cerr << "couldn't open: " + string(*p);
  10. } //每次循环input都会离开作用域而被销毁

注:1.如果ofstream对象要打开的文件不存在,那么它会自动创建一个对应字符串参数名字的文件。

2.如果文件存在,那么out模式下打开文件会丢弃已有数据,也就是说写入的内容会覆盖原有文件内容,避免这种情况的方法是指定打开的模式为app(append的缩写)。

  1. int main()
  2. {
  3. string file;
  4. while(cin >> file)
  5. {
  6. ofstream out(file);
  7. // ofstream out(file,ios::app); 使用这种模式则会将写入内容添加到文件末尾
  8. if(out)
  9. {
  10. string data;
  11. cin >> data;
  12. out << data; //会覆盖文件内容
  13. out.close();
  14. cout << "Success" << endl;
  15. }
  16. else
  17. {
  18. cerr << "Open: "<< file <<" failed!" << endl;
  19. continue;
  20. }
  21. }
  22. }

string流

三种类型:istringstream、ostringstream、stringstream,与文件流类似,只不过操作对象从文件变为了string。

stringstream特有的操作:

  1. stringstream strm; //未指定绑定的对象
  2.  
  3. stringstream strm(s); //拷贝构造
  4.  
  5. string s = strm.str(); //返回strm流保存的string的拷贝
  6.  
  7. strm.str(s) //将字符串s拷贝到strm流中

使用istringstream

1.考虑读取以下数据

格式:

人名        家庭电话   手机电话

morgan  20141441  2325255224

Jack       23232333   45525222

Lee        7944732   72255252

2.首先确定对象类

  1. struct PersonInfo
  2. {
  3. string name;
  4. vector<string> phones;
  5. }
  6. /*
  7. 1.C++中struct的默认访问修饰符为public。从语法上来说与class只有访问修饰符的区别
  8. 2.一般来说,struct适合构建只含有数据成员的对象,即精简的对象。
  9. 3.另外在C#中,struct属于值类型
  10. */

3.读取数据文件并操作

  1. string line,word;
  2. vector<PersonInfo> people;
  3. //逐行从输入中读取数据,直至cin遇到文件末尾或者其他错误
  4. while(geline(cin,line))
  5. {
  6. PersonInfo info;
  7. istringstream record(line); //将记录绑定到刚读入的行
  8. record >> info.name; //读入名字,注意string流以空格为默认分界符
  9. while(record >> word)
  10. info.phones.push_back(word); //读取电话
  11. people.push_back(info);
  12. }

使用ostringstream

假如需要对上文的电话号码进行格式验证,符合格式的才进行输出,那么有:

  1. for(const auto &entry:people)
  2. {
  3. ostringstream formatted,badNums;
  4. for(const auto &nums:entry.phones)
  5. {
  6. if(!valid(nums)) //验证格式是否符合要求
  7. {
  8. badNums << " " << nums;//不符合格式将其以字符串形式存入badNums
  9. }
  10. else
  11. formatted << " " << format(nums); //写入formatted等待输出
  12.  
  13. if(badNums.str().empty())
  14. os << entry.name << " " << formatted.str() << endl;//符合格式,成功输出
  15. else
  16. cerr << "input error:" << entry,name << "invalid number(s)" << badNums.str() << endl;
  17.  
  18. }
  19. }

 总结

  • iostream负责控制台IO
  • fstream负责文件IO
  • stringstream负责内存中string的IO

另外,类fstream和stringstream都是继承自iostream,所以输入类都继承自istream,输出类都继承自ostream。因此,在istream对象上执行的操作同样可以应用于ifstream或者istringstream对象;ostream同理。

C++相关:C++的IO库的更多相关文章

  1. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  2. 【转载】C++ IO库

    本篇随笔为转载,原贴地址:<C++ Primer>第8章 IO库 学习笔记. 1.IO类 #include <iostream> istream//从流中读取数据 ostrea ...

  3. PostgreSQL相关的软件,库,工具和资源集合

    PostgreSQL相关的软件,库,工具和资源集合. 备份 wal-e - Simple Continuous Archiving for Postgres to S3, Azure, or Swif ...

  4. C++ Primer 读书笔记: 第8章 标准IO库

    第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于 ...

  5. 标准模板库——IO库

    IO库设施: . istream(输入流)类型,提供输入操作. . ostream(输出流)类型,提供输出操作. . cin,一个istream对象,从标准输入读取数据. . cout,一个ostre ...

  6. IO库----IO类,文件输入输出,string流

    一.IO类 1.IO库类型和头文件表: 头文件 类型 iostream istream,wistream 从流读取数据 ostream,wostream 向流写入数据 iostream,wiostre ...

  7. C/C++基础----标准库几个工具库tuple,bitset,正则表达式,随机数,IO库

    tuple tuple可以有任意多个成员 默认初始化,值初始化 构造函数是explicit,必须直接初始化 make_tuple(v1,v2,-,vn) get<i> (t) 返回第i个数 ...

  8. C/C++基础----IO库

    IO对象无拷贝或赋值,通常以引用形式传递. IO库条件状态 strm::iostate 一种机器相关的类型,提供了表达条件状态的完整功能 strm::badbit 用来指出流已经崩溃 strm::fa ...

  9. C5 标准IO库:APUE 笔记

    C5 :标准IO库 在第三章中,所有IO函数都是围绕文件描述符展开,文件描述符用于后续IO操作.由于文件描述符相关的操作是不带缓冲的IO,需要操作者本人指定缓冲区分配.IO长度等,对设备环境要求一定的 ...

随机推荐

  1. AndroidBinder进程间通信系统-android学习之旅(86)

    目录 前言及知识准备 Service组件结构 Clinet组件结构 与Binder驱动程序交互 总结 Binder进程间通信实例 问题 本次主要介绍Android平台下Binder进程间通信库.所谓通 ...

  2. 【一天一道LeetCode】#19. Remove Nth Node From End of List

    一天一道LeetCode系列 (一)题目 Given a linked list, remove the nth node from the end of list and return its he ...

  3. 写的还不错的专题,android性能优化

    http://www.trinea.cn/android/android-performance-demo/

  4. volley请求原理

    Volley 实现原理解析 本文为 Android 开源项目实现原理解析 中 Volley 部分 项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo 分析者:g ...

  5. Android SDK下载失败的解决方法

    Android SDK下载失败的解决方法 图1 在下载过程中,Android SDK Manager Log中出现下面出错信息: Preparing toinstall archives Downlo ...

  6. iOS关于蓝牙连接的简单介绍与使用

    下面是两台iPhone6连接同一台蓝牙设备的结果: **成功连接**** peripheral: <CBPeripheral: 0x1700f4500, identifier = 50084F6 ...

  7. iOSAPP启动效果复杂动画之抽丝剥茧

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...

  8. AngularJS进阶(二)AngularJS路由问题解决

    AngularJS路由问题解决 遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去.再加一层地址解决了,但是后来发现问题还是来了: Could not resolve 'yhDtlMain ...

  9. python实现博客自动刷点击脚本

    #A Auto-Visit Web Site Tool import urllib import time import random print "Auto Click the WebPa ...

  10. Gradle 1.12用户指南翻译——第四十三章. 构建公告插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...