在项目中会经常用到读取一些配置数据,这些数据根据实际需要有可能会调整,如果将这些数据直接嵌入进代码中会非常不便,需要经常调整代码。将这些数据写入配置文件中然后在读入,如果需要调整,只需修改配置文件,code不用作任何改动,这样会非常方便。最常用到的读取配置文件的方式是使用istream类。

std::istream: input stream. Input stream objects can read and interpret input from sequences of characters. The standard object cin is an object of this type.

标准中定义的std::cin就是istream类型。istream是std::basic_istream类模板的一个实例化。

c++中定义的标准输入输出流是istream和ostream,他们是iostream类的父类,而cin是istream的对象,cout是ostream的对象。头文件fstream(对文件操作的流)包含了ifstream和ofstream,头文件sstream(对字符串操作的流)包含了istringstream和ostringstream,这些类都是继承自istream和ostream的。它们的关系如下图:

有两种情况会使一个istream对象的bool转型为false:读到EOF(文件结束标志)或遇到一个无效的值(输入流进入fail状态)。istream对象的bool转型为false的情况下,此后的所有读入动作都是无操作。直到调用istream对象的成员函数clear()来清除该对象的内部状态。

缺省情况下,输入操作符丢弃空白符、空格符、制表符、换行符以及回车。如果希望读入上述字符,或读入原始的输入数据,一种方法是使用istream的get()成员函数来读取一个字符,另一种方法是使用istream的getline()成员函数来读取多个字符。istream的read(char* addr, streamsize size)函数从输入流中提取size个连续的字节,并将其放在地址从addr开始的内存中。istream成员函数gcount()返回由最后的get()、getline()、read()调用实际提取的字符数。read()一般多用在读取二进制文件,读取块数据。

输入流有三个函数来测试流状态:即bad(),fail()和eof()。ignore()用来抛掉指定个数的缓冲区中的字节。如果bad()为真,代表是遇到了系统级的故障。如果fail()为真,则表示输入了非法的字符。

其它的istream成员函数:putback( char c ) 将字符放回iostream;unget()往回重置”下一个”istream项;peek()返回下一个字符或EOF,但不要提取出来。

以下是测试代码:

#include <iostream>
#include <fstream>
#include <string>
#include "istream.hpp"void test_istream()
{//std::istringstreamstd::filebuf in;if (!in.open("E:/GitCode/Messy_Test/testdata/istream.data", std::ios::in)) {std::cout << "fail to open file" << std::endl;return;}std::istream iss(&in);std::string str;int count = 0;while (!iss.eof()) {if (iss.bad()) {std::cout << "input stream corrupted" << std::endl;break;}if (iss.fail()) {std::cout << "bad data" << std::endl;iss.clear(std::istream::failbit);iss.ignore(256, '\n');continue;}std::getline(iss, str);if (str == "#filename:") {iss >> str;std::cout << "file name: " << str << std::endl;}if (str == "#content:") {std::getline(iss, str);std::cout << "file content: " << str << std::endl;}if (str == "#add operation:") {int a, b;iss >> a >> b;std::cout << "a + b = " << (a + b) << std::endl;}if (str == "#char array:") {char a, b, c, d, e, f;iss >> a >> b >> c >> d >> e >> f;std::cout << a << "  " << b << "  " << c << "  " << d << "  " << e << "  " << f << std::endl;}if (str == "#int array:") {int arr[2][3];for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {iss >> arr[i][j];}}for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {std::cout << arr[i][j] << "    ";}std::cout << std::endl;}}if (str == "#mean value:") {float mean_value;iss >> mean_value;std::cout << "mean_value = " << mean_value << std::endl;}}in.close();
}

执行结果如下图:

主要参考文献:

1. http://www.cplusplus.com/reference/istream/istream/

2. http://www.zaojiahua.com/inputoutput-stream.html

GitHub:https://github.com/fengbingchun/Messy_Test

C++中istream的使用相关推荐

  1. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  2. MFC显示JPG、JIF图片

    链接:http://blog.csdn.net/friendan/article/details/38358507 注:此代码不存在内存泄露,很好的代码 控件ID:picture控件:IDC_STAT ...

  3. C++流操纵算子(格式控制)

    输入/输出的数据没有指定格式,它们都按缺省的格式输入/输出.然而,有时需要对数据格式进行控制.这时需利用ios类中定义的格式控制成员函数,通过调用它们来完成格式的设置. ios类的格式控制函数如下所示 ...

  4. C++ IO类(3) 文件流

    我们可以通过文件流来控制文件的输入以及输出: fstream: 创建一个未绑定的文件流 fstream fstrm("file.txt")  创建一个fstream,并打开名为s的 ...

  5. MFC显示JPG,bmp图片

    主要代码如下: //************************************ // 方法说明:    显示JPG和GIF.BMP图片 // 参数说明:    CDC * pDC     ...

  6. 流和流库[给初学者非常有用]

    流和流库 概 述        在C语言中,输入/输出系统的特点是缺乏类型检查机制.如printf函数,在格式控制字符串后的参数,即使类型和个数与其不匹配,编译是不会出错,但运行时会得到错误的结果.C ...

  7. MFC 音量控制相关资料

    MMRESULT 可能是 WINMM (视窗多媒体 库 Winmm.dll 里 用的一个enum型变量), public static enum MMRESULT : uint{ MMSYSERR_N ...

  8. 总结C++所有的输入输出方法(包含文件流)

    输入输出流 输入 1. cin.get() 2. cin.getline() 3. getchar() 4. gets() c11以上版本已弃用,请使用gets_s() 5. getline() 6. ...

  9. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

最新文章

  1. mysql pma用户_MYSQL用户权限管理学习笔记
  2. CNN、RNN、DNN的内部网络结构有什么区别?
  3. golang sync.Mutex 互斥锁 使用实例
  4. oracle数据库的net manager配置监听(插图)
  5. 用通俗易懂的大白话讲解Map/Reduce原理
  6. [云炬创业基础笔记]第七张创业团队测试3
  7. python实验三答案_20194123 实验三《Python程序设计》实验报告
  8. 如何快速精确的和leader沟通
  9. 5.10 Ext JS Grid中 WidgetColumn(组件列)的使用
  10. 分布式锁是啥?对比下redis和zk两种分布式锁的优劣?
  11. 军事指挥系统时间同步解决方案
  12. DSP28377s系统时钟配置注意事项
  13. 30天自制操作系统(day10)
  14. 系统并发量及常见性能指标
  15. 【无人机】无刷电调学习之路
  16. 计算机网络教程实验二——静态路由配置实验心得
  17. 用于采集数据的工具——StatsD
  18. 如何投影一个纹理 (翻译:心蓝 潘李亮)
  19. 《新神榜:杨戬》这样的爆款影视动漫作品,原来都掌握了一个成功密码
  20. 亲密接触中国SaaS应用(下)

热门文章

  1. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
  2. 业务逻辑组件化android,AppJoint 极简 Android 组件化方案
  3. 图像几何变换C++实现--镜像,平移,旋转,错切,缩放
  4. python动态类型是如何实现的_Python 的动态类型系统
  5. Udacity机器人软件工程师课程笔记(三十六) - GraphSLAM
  6. 【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型
  7. 在CentOS 6.9 x86_64的OpenResty 1.13.6.1上使用LuaRocks示例
  8. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV
  9. 编译内核指定模块,筛选当前模块依赖的组件
  10. 【MySQL解惑笔记】忘记MySQL数据库密码