• 【C++ Primer】 第八章 IO库 习题 答案


    本文参考书籍C++Primer 5th,这个专栏主要分享我的学习笔记与总结,以及课后题答案。
    在这里插入图片描述

    8.1

    在这里插入图片描述

    #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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    8.3

    在这里插入图片描述
    读取到无效数据的时候

    8.4

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    需要一个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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    8.7

    在这里插入图片描述
    加上这个 知识点 用 char * 设置为文件名 方便保存!!
    在这里插入图片描述

    8.9

    在这里插入图片描述

    
    #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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    8.10

    做过类似的 不做 了 答案如下
    在这里插入图片描述

    8.13

    
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    🌹感谢阅读🌹

  • 相关阅读:
    Java接口和抽象类的区别
    Html 后端了解基础
    骨传导耳机的利与弊有哪些?骨传导耳机到底好不好?
    JDK8中HashMap底层源码解析-resize方法
    创建高性能的索引
    rust字符串
    使用QLoRA对Llama 2进行微调的详细笔记
    C#用API读取.ini非中英文路径失败问题
    c++概述-语言特征
    人体神经元细胞模式图示,神经元细胞结构模式图
  • 原文地址:https://blog.csdn.net/weixin_49486457/article/details/125449301