c++primer 练习题8.1-8.14

2019-05-03  本文已影响0人  青吟乐

8.1函数方法实现

istream& function(istream& is){
    //定义一个buffer接收输入流is的内容
    string buffer;
    //用whilie条件判定流对象的状态是否良好
    while(is>>buffer){
        //显示从is对象读入buffer的内容
        cout<<buffer<<endl;
    }
    //清除异常位使is有效
    is.clear();
    return is;
}

8.2接8.1

int main()
{
    string str;
    //放入cin里面点东西
    cout<<"输入字符串流"<<endl;
    //从cin中读入is
    istream& is = function(cin);
    //显示is的当前的状态
    is>>str;
    cout << is.rdstate() << endl;
    return 0;
}

8.3
cin没问题会一直循环
循环终止条件:cin的failbit位,eofbit位,badbit位任何一位出现问题都会终止循环
8.4 函数加运行测试

#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
void readFileToVector(const string& fileName, vector<string>& vec)
//文件路径用const固定
{
    //创建一个输入流对象并且打开文件
    ifstream ifs(fileName);
    if (ifs)//验证文件是否打开
    {
        cout<<"文件打开成功"<<endl;
        //用一个string类型接收文件内容
        string buf;
        while (getline(ifs, buf)){//判断是否成功读入一行数据到buf
            //看看读入了什么内容,发现木得问题
            cout<<buf<<endl;
            vec.push_back(buf);
            }
    }
}


int main()
{
    vector<string> vec;
    string str="C:\\study\\c++test\\endless.txt";
    readFileToVector(str,vec);
    return 0;
}

8.5只是将getline方法改成了ifs>>,main方法不再赘述

//文件路径用const固定
void readFileToVector(const string& fileName, vector<string>& vec)
{
    //创建一个输入流对象并且打开文件
    ifstream ifs(fileName);
    if (ifs)//验证文件是否打开
    {
        cout<<"文件打开成功"<<endl;
        //用一个string类型接收文件内容
        string buf;
        while (ifs>>buf){
            //这里注意测试的时候给的文件内容要有空格才会断行
            cerr<<buf<<endl;
            vec.push_back(buf);
            }
    }
}

8.6这里我只是简单的给了ifs对象一个绝对路径将里面的内容读入到trans对象中

string str = "C:\\study\\c++test\\endless.txt";
int main(string xxx)
{
    //接收一个string的文件名
    xxx=str;
    ifstream ifs(xxx);
    Sales_data total;
    if (read(ifs, total))
    {
        Sales_data trans;
        while (read(ifs, trans))
        {
            if (total.isbn() == trans.isbn())
                total.combine(trans);
            else
            {
                print(cout, total) << endl;
                total = trans;
            }
        }
        print(cout, total) << endl;
    }
    else
    {
        cerr << "No data?!" << endl;
    }
        return 0;
}

8.7
代码

#include <iostream>
#include"Sales_date.h"
#include<fstream>
#include <iostream>
using namespace std;


int main(char **addr)
{
    //接收文件名
    addr[0]="C:\\study\\c++test\\endless.txt";
    addr[1]="C:\\study\\c++test\\in_file.txt";
    //创建输入输出流对象
    ifstream ifs(addr[0]);
    ofstream ofs(addr[1]);
    Sales_data total;
    //如果从total对象中读入数据正常
    if (read(ifs, total))
    {
        Sales_data trans;
        //从trans对象中读入数据正常就循环
        while (read(ifs, trans))
        {
            if (total.isbn() == trans.isbn())
                total.combine(trans);
            else
            {
                print(ofs, total) << endl;
                total = trans;
            }
        }
        print(ofs, total) << endl;
    }
    else
    {
        cerr << "No data?!" << endl;
    }
        return 0;
}

8.8,在8.7定义输出流对象ofs的时候用ate或者app模式打开即可

    ofstream ofs(addr[1],ofstream::app);//默认打开模式设定为app模式

8.9,用8.1.2节的方法创建istringstream的对象,将其中的内容输入到字符串并显示

#include <iostream>
#include<sstream>
using namespace std;

istream& Return(istream& is){//以istream对象的地址传参
    string is_stream;//istream对象中的内容写入到stream中
    while(getline(is,is_stream)){//按行检测
        cout<<is_stream<<endl;//按行输出
    }
    is.clear();
    return is;
}

int main()
{
    string str="吹 牛 x\n 是的撒多";
    istringstream iss(str);
    Return(iss);
    return 0;
}

8.10,利用8.1.3的方法从文件读到vector中,再从vector中读出啦

#include <iostream>
#include<sstream>
#include<vector>
#include<fstream>
using namespace std;

//从文件中读入vector的方法
void readFileToVector(const string& fileName, vector<string>& vec)
{
    //创建一个输入流对象并且打开文件
    ifstream ifs(fileName);
    if (ifs)//验证文件是否打开
    {
        cout<<"文件打开成功"<<endl;
        //用一个string类型接收文件内容
        string buf;
        while (ifs>> buf){//判断是否成功读入一行数据到buf
            vec.push_back(buf);
            }
    }
}

int main()
{
    //从文件中读入到vec
    vector<string> vec;
    string str="C:\\study\\c++test\\endless.txt";
    readFileToVector(str,vec);

    //从vec读入到string字符串中
    for (auto &s : vec)
    {
        istringstream iss(s);//用s去遍历vec
        string word;
        while (iss >> word)
            cout << word << ", ";//因为>>读入的时候碰到,自动断
    }

    return 0;
}

8.11

int main()
{
    string line,word;
    vector<PersonInfo> people;
    //定义要求的istringstream对象record;
    istringstream record;
    while(getline(record,line)){
        PersonInfo info;
        //确保record能用
        record.clear();
        //当前line数据拷贝到record中,
        //此行基本代替了书上将对象实例化在while循环中
        //书中是在此处实例化临时对象的同时
        record.str(line);
        record >> info.name;
        while(record>>word){
            info.phones.push_back(word);
        }
        people.push_back(info);
    }
    return 0;
}

8.12
PersonInfo类中都是public属性的变量,不需要在类内初始化就可以在类外修改
8.13
以下代码未验证,仅供参考。。。

#include <iostream>
#include<vector>
#include<stringstream>
#include<fstream>
using namespace std;
class PersonInfo{
public:
  string name;
  vector<string> phones;
};

int main()
{
    ifstream ifs("C:\\study\\c++test\\endless.txt");
    string line ,word;//保存来自输入的一行和一个单词的数据
    vector <PersonInfo> people;//保存文件的一切信息
    while(getline(ifs,line)){
        PersonInfo info;
        istringstream record(line);
        record>>info.name;
        while(record>>word){
            info.phones.push_back(word);
        }
        people.push_back(info);
    }
    for(const auto &entry:people){
        ostringstream formatted,badnums;
        for(const auto &nums:entry.phones){
            if(!vaild(nums)){
                badnums<<" "<<nums;
            }else{
                formated<<" "<<format(nums);
            }
        }
        if(badnums.str().empty()){
            os<<entry.name<<" "<<formatted.str()<<endl;
        }else{
            cerr<<"input error:"<<entry.name<<"invailed number(S)"<<badnums.str()<<endl;
        }
    }
    return 0;
}

8.14
类类型的参数使用地址传递效率更高,速度更快
const关键字防止意外修改参数

上一篇下一篇

猜你喜欢

热点阅读