本文参考书籍C++Primer 5th,这个专栏主要分享我的学习笔记与总结,以及课后题答案。
#include <iostream>
#include <fstream>
using namespace std;
istream& f(istream& is) {
int i;
while(!is.eof() ) {
is >> i;
if(is.bad()) { // 读写出错
throw runtime_error("error IO");
}
if(is.fail()) {//不是int
cerr << "not int continue transform" << endl;
is.clear();
is.ignore(100,'\n'); //把回车之前的\n清除掉
continue;
}
cout << i << endl;
}
is.clear();
return is;
}
int main () {
f(cin);
return 0;
}
读取到无效数据的时候
需要一个txt文件
#include <vector>
#include <string>
#include <iotream>
#include <fstream>
using namespace std;
void read_vs(vector<string> &vs) {
ifstream ifs;
ifs.open("8.4.txt",ios::in);
string line;
if(ifs.fail()) {
cout << "fail open the file" << endl;
return;
}
while(!ifs.eof()) {
getline(ifs, line); // 按行存储 如果想按单词村 可以用 while(ifs >> line)
vs.push_back(line);
}
}
int main () {
vector<string> vs;
read_vs(vs);
for(auto it : vs) {
cout << it << endl;
}
return 0;
}
加上这个 知识点 用 char * 设置为文件名 方便保存!!
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
istream & f(istream& in) {//输出对象
string s;
while (in >> s,!in.eof()) {
if(in.bad()) {
throw runtime_error("not IO");
}
if(in.fail()) {
cerr << "continue cin " << endl;
in.clear();
in.sync();
continue;
}
cout << s << endl;
}
in.clear();
return in;
}
int main () {
ostringstream s;
s << "CPT newBeef" << endl;
istringstream in(s.str());
f(in);
return 0;
}
做过类似的 不做 了 答案如下
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
struct PersonInfo {
string name;
vector<string> phones;
};
string format(const string &s) {
return s;
}
bool valid(const string &s) {
return true;
}
int main () {
string line, word;
//分别保存来自输入的一行和单词
vector<PersonInfo> people;
//保存来自输入的所有记录
while(getline(cin,line)){
PersonInfo info;
// 张三 18170991111 李四 18611118668 王二 13022228888
// 0108431123 13877776666
// @阿⻄拜-南昌 07918888888
istringstream record(line);
record >> info.name;
while( record >> word)
info.phones.push_back(word); //保存他们
people.push_back(info);
}
ostringstream os;
for(const auto &entry:people){//对people中每一项
ostringstream formatted,badNums; //每个循环步创建的对象
for(const auto &nums:entry.phones){
if(!valid(nums)){
badNums<<" "<<nums;//将数的字符串形式存入badNums
} else
formatted<<" "<<format(nums);//将格式化的字符串“入”formatted
}
if(badNums.str().empty()) //没有错误的数
os<<entry.name<<" "<<formatted.str()<<endl;//打印名字和格式化的数
else//否则,打印名字和错误的数
cerr<<"input error:"<<entry.name<<"invalid numbers(s) "<<badNums.str()<<endl;
}
return 0;
}