#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;
}
}
C++ primer 第八章 IO类和string流 一体式笔记(含大量注释)
最新推荐文章于 2024-10-06 10:17:48 发布