cppPrimer学习8th

8.1

8.2

/*
编写函数,接受一个istream &参数,返回值也是istream&。此函数必须从给定流中读取数据,直至遇到文件结束标识符时停止。
它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。
*/

#include <iostream>
using namespace std;

istream &readeof(istream &in)
{
    string s;
    while (in >> s && !in.eof())
    {
        cout << s;
        in.clear();
    }
    in.clear();
}

int main(int argc, char const *argv[])
{
    readeof(cin);
    cout << "Get EOF" << endl;
    while (1)
        ;
    return 0;
}

8.3

while (cin >> i) /* ... */
// 遇到结束符
// 如果i是int 但是输入了其他字符

8.4

8.5

/*
8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存于vector中
8.5 按照单词分割
*/

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

void Each(istream &in, string option)
{
    if (!in)
    {
        cerr << "Check FIle" << endl;
        while (1)
            ;
    }
    string s;
    vector<string> v;

    if (option == "line")
    {
        while (getline(in, s))
            v.push_back(s);
    }
    else
    {
        while (in >> s)
            v.push_back(s);
    }

    for (auto a : v)
    {
        cout << a << endl;
    }
}

int main(int argc, char const *argv[])
{
    string filepath = "C:\\JLink.log";
    ifstream in(filepath);

    cout << "Split By Line" << endl;
    Each(in, "line");
    in.close();

    cout << "Split By Word" << endl;
    in.open(filepath);
    Each(in, "word");

    while (1)
        ;
    return 0;
}

8.9

/*使用8.1.2节第一个练习所编写的函数打印一个istringstream对象的内容*/

/*
编写函数,接受一个istream &参数,返回值也是istream&。此函数必须从给定流中读取数据,直至遇到文件结束标识符时停止。
它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。
*/

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

istream &readeof(istream &in)
{
    string s;
    while (in >> s)
    {
        cout << s;
        in.clear();
    }
    cout << endl;
    in.clear();
}

int main(int argc, char const *argv[])
{
    //readeof(cin);
    stringstream ss("1234567");
    readeof(ss);
    cout << "Get EOF" << endl;
    while (1)
        ;
    return 0;
}

8.10

/*
8.10 编写程序,将来自一个文件中的行保存在一个vector中,然后使用一个istringstream从vector读取数据元素,每次读取一个单词。
*/

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

int main(int argc, char const *argv[])
{
    string filepath = "C:\\JLink.log";
    ifstream in(filepath);

    if (!in)
    {
        cout << "Check File" << endl;
    }

    vector<string> line;
    string s;
    while (getline(in, s))
    {
        line.push_back(s);
    }

    for (auto c : line)
    {
        stringstream ss(c);
        string ch;
        while (ss >> ch)
        {
            cout << ch << endl;
        }
    }

    while (1)
        ;
    return 0;
}

8.11

/*
8.11 本节的程序在外层while循环中定义了istringstream对象。
如果record对象定义在循环之外,你需要对程序做怎样的修改?
重写程序,将record的定义移到while循环之外,验证你设想的修改方法是否正确。
*/

//使用string的clear

8.12

我们为什么没有在PersonInfo中使用类内初始化?

因为这里我们使用了聚合类,不需要类内初始化

8.14

我们为什么要将entry和nums定义为const auto&。

使用引用避免拷贝
使用const 因为不会赋值
posted @ 2020-03-14 10:20  zongzi10010  阅读(158)  评论(0编辑  收藏  举报