C++中istream的使用

news/2024/5/9 19:00:40

在项目中会经常用到读取一些配置数据,这些数据根据实际需要有可能会调整,如果将这些数据直接嵌入进代码中会非常不便,需要经常调整代码。将这些数据写入配置文件中然后在读入,如果需要调整,只需修改配置文件,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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/29356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

C++中操作符重载的使用

当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符共同组成。和其它函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。重载运算…

按下回车键指向下一个位置的一个函数

functiontofocus(itemname) // 按回车置下一个位置 2{ 3vara 4aeval( " document.vouch. "itemname) 5a.focus() 6} 7 在控件中使用onkeypress" javascrip:if(window.event.keyCode13){tofocus(nextformname)}提取下一个控件名

mysql 5.7编译安装重启_mysql5.7源码编译安装

安装mysql前的准备&#xff1a;一、安装依赖的库&#xff1a;yum install gcc-c ncurses-devel perl-Data-Dumper python-devel openssl openssl-devel二、 安装cmake(因为mysql5.7的编译由cmake来实现)安装cmake&#xff1a;cd cmake-2.8.8/预编译和安装&#xff1a;./bootst…

json11库的使用

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式&#xff0c;易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集&#xff0c;但JSON是独立于语言的文本格式&#xff0c;并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许…

mysql邮箱配置文件_SQL-数据库邮箱配置

一、启用数据库邮件手动启用数据库邮件功能&#xff0c;需执行以下脚本&#xff1a;exec sp_configure show advanced options,1RECONFIGUREexec sp_configure Database Mail XPs,1RECONFIGURE With Override二、配置数据库邮件1、启用配置向导如果事先没有手动启用数据库邮件功…

029 浏览器不能访问虚拟机的问题解决

1.在搭建分布式时 ssh一直不能进行scp&#xff0c;后来发现一个问题。 windows中的hosts配置了三台虚拟机的映射&#xff0c;但是在虚拟机中的hosts没有配置。 做法是在每台虚拟机上都配置三台虚拟机的映射。 2.端口访问与防火墙 最近帮别人解决问题时才注意的。 以前安装好虚拟…

C++中fstream的使用

C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类&#xff0c;它们继承了插入和提取运算符&#xff08;以及其他成员函数&#xff09;&#xff0c;还有与文件一起使用的成员和构造函数。可将…

按esc键退出的一个函数

1functionesckey(keycode) // 按esc键退出2{ 3if (keycode 27 ) 4{ 5window.close() 6} 7}