C++ primer 第八章 IO类和string流 一体式笔记(含大量注释)

#include<string>
#include<vector>
#include<iostream>
#include<sstream>

struct PersonInfo 
{
	std::string name;
	std::vector<std::string> phones;
};

//string类所用函数,(未定义)
std::string format(std::string);
bool valid(std::string);

int main(int argc,char* argv[]) {	//argc表示argv数组中的字符串数量,arvg第一个元素指向程序的名字或者一个空字符串,接下来的元素一次传递命令行提供的实参
	
	/*****IO类******/
	/*每个IO对象都维护一组条件状态,用来指出吃对象上是否可以进行IO操作,如果遇到错误,其状态就会变成失效,后续不能执行*/
	//iostream处理控制台IO,后两者都是继承自类iostream,输入和输出的类也是各自对应的
	//fstream处理命名文件IO
	//stringstream完成内存string的IO

	auto old_state = std::cin.rdstate();    //记录cin的状态
	std::cout << typeid(old_state).name()<<std::endl;	//int类型
	std::cin.clear();
	std::cin.setstate(old_state);
	//刷新缓冲区
	std::cout << std::endl;
	std::cout << std::flush;
	std::cout << std::ends;	//输出一个空字符
	std::cout << std::unitbuf;
	/*任何输出都立即刷新,无缓冲*/
	std::cout << std::nounitbuf;	//回归正常缓冲方式

	/*交互式系统通常应该关联输入流和输出流,所有的输出包括用户提示信息,都会在读操作之前被打印出来*/
	//标准库就是将cout和cin关联在一起,因此 cin>>ival 会导致cout的缓冲区刷新
	//x.tie(&o) 将流x关联到输出流o,并返回原先指向x绑定的输出流的指针,如果无返回空指针
	std::cin.tie(&std::cout);	//仅作展示,标准库已经将两者关联
	std::ostream* old_tie = std::cin.tie(nullptr);
	std::cin.tie(&std::cerr);
	std::cin.tie(old_tie);

	//string流

    std::vector<PersonInfo> people;

    //记录people信息
	std::string line, word;
	while (getline(std::cin, line)) {
		PersonInfo info;
		std::istringstream record(line);	//将记录绑定到刚读入的行,从line中读取数据,处理输入行内的单个单词
		record >> info.name;	//读取第一个单词,即名字
		while (record >> word)	//读取电话号码
			info.phones.push_back(word);
		people.push_back(info);
	}

	/*当我们希望逐步构造输出,最后一起打印时,就会用到ostringstream*/
	//验证people中的每一项是否有效,验证完后再进行一次性输出
	for (const auto& entry : people) {//people中的每一项逐一验证
		std::ostringstream formatted, badNums;
		for (const auto& nums : entry.phones) {
			if (!valid(nums)) {	//如果无效
				badNums << " " << nums;	//将数的字符串形式存入badNums
			}
			else
				formatted << " " << format(nums);	//将格式化的字符串存入formatted
		}
		if (badNums.str().empty())	//没有错误的数
			std::cout << entry.name << " "
			<< formatted.str() << std::endl;
		else	//打印错误的数
			std::cerr << "input error :" << entry.name
			<< "invalid number(s) " << badNums.str() << std::endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值