C++中istream的使用

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

GitHubhttps://github.com/fengbingchun/Messy_Test

 

  • 14
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言,流(stream)是指用来处理输入输出的抽象概念。而istreamC++的输入流类,用于从输入设备(如键盘或文件)读取数据。istream类提供了多种成员函数用于读取不同类型的数据。 引用的代码展示了使用ifstream类(继承自istream)从文件读取数据并输出到控制台。通过调用`fin.rdbuf()`可以将文件的数据读取到标准输出流。 引用的代码展示了使用istream_iterator和ostream_iterator从输入流读取数据并写入到输出流。这里的输入流是通过ifstream类创建的,并且使用`unsetf(ios::skipws)`取消了输入流的空白字符的忽略。 引用提供了istream类的一些成员函数的原型。这些成员函数可用于从istream对象读取数据,包括单个字符、字符数组和字符流缓冲区等。 综上所述,istreamC++的输入流类,用于从输入设备读取数据。它提供了多种成员函数用于从流读取不同类型的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++ 流(stream)总结](https://blog.csdn.net/luguifang2011/article/details/40979231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值