C ++ Primer: cin con antes de la prueba (8.11 Respuestas al ejercicio)


1. Antecedentes

Este procedimiento sección:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
struct PersonInfo
{
    string name;
    vector<string> phones;
};

int main()
{
    string line, word;
    vector<PersonInfo> people;
    while (getline(cin, line)) //读取个人信息:名字、电话
    {
        PersonInfo info;
        istringstream record(line);
        record >> info.name; //保存名字
        while (record >> word)
        {
            info.phones.push_back(word); //保存多个电话
        }
        people.push_back(info);
    }

    for (auto &a1 : people) //打印保存的数据
    {
        cout << a1.name << " ";
        for (auto &a2 : a1.phones)
        {
            cout << a2 << " ";
        }
        cout << endl;
    }

    return 0;
}

Los datos de entrada:

morgan 2015552368 8625550123
drew 9735550130
lee 6095550132 2015550175 8005550000

salida:
Los resultados operativos

Ejercicio 8.11: Esta sección del programa (como programa) define el exterior objeto istringstream mientras bucle. Si graba un objeto se define fuera del bucle, se necesita un programa para modificar qué? Re-programa que va a grabar la definición del bucle while para mover la verificación fuera de modificar la forma en que lo previsto correcta?

2. Las respuestas

Corrección de errores:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
struct PersonInfo
{
    string name;
    vector<string> phones;
};

int main()
{
    string line, word;
    vector<PersonInfo> people;
    istringstream record;      //修改
    while (getline(cin, line)) 
    {
        PersonInfo info;
        // istringstream record(line);
        record.str(line);    //修改
        record >> info.name; 
        while (record >> word)
        {
            info.phones.push_back(word); 
        }
        people.push_back(info);
    }

    for (auto &a1 : people) 
    {
        cout << a1.name << " ";
        for (auto &a2 : a1.phones)
        {
            cout << a2 << " ";
        }
        cout << endl;
    }

    return 0;
}

salida:
Los resultados operativos

análisis:

  1. A medida que el registro se coloca en el programa, mientras que en realidad definida fuera, pero sólo el resultado del programa para modificar la salida de la primera información personal, diferentes de los resultados originales. Modificar el error del programa.
istringstream record(line);//while内定义
//改为
istringstream record;      //while外定义
record.str(line);    //while内赋值
  1. La puesta en encontrar el programa adecuado, por primera vez se pueden guardar a través de la siguiente capa interior rato, pero la próxima vez que pase a través de la capa interior para salir del programa, mientras que el registro >> palabra del valor de retorno es falsa.
while (record >> word)
{
    info.phones.push_back(word); //保存多个电话
}
  1. La primera vez que ejecute la capa interna, mientras que, cuando el expediente del estado de sólo lectura final fichero de posición, eofbit y failbit se establece, el error de retorno para salir del bucle. Cuando la próxima vez que entre en la capa interna, mientras, se ha producido un error de registro, no puede guardar datos.

C ++ versión Primer Chino (Versión 5) en la página 280:
  un flujo en el caso de un error. operaciones IO posterior a ésta fallará. Sólo cuando una corriente es el estado libre de errores, podemos leer datos de él, para escribirlo.
  >> rendimientos de expresión mientras que los cheques de bucle del estado de la corriente. Si la operación de entrada se realiza correctamente, la corriente sigue siendo válida.
  Si se llega al final de la ubicación del archivo, eofbit y failbit habrá conjunto.
  Si badbit, eofbit, failbit bien se establece, las condiciones de estado de flujo detectadas fallarán.

  1. Si el registro se define en la capa exterior, mientras que, cuando se re-define el registro para cada ciclo, el estado inicial sin error, mientras que la capa interna de manera que cada pase puede guardar los datos, después de leer la salida de error de registro de datos, mientras que la capa interior.
    while (getline(cin, line)) //外层while
    {
        PersonInfo info;
        istringstream record(line);//外层while内定义
        record >> info.name; 
        while (record >> word)//内层while
        {
            info.phones.push_back(word);
        }
        people.push_back(info);
    }
  1. Si el registro se define en una capa exterior mientras que, después de la operación inicial de la mientras que la insuficiencia registro capa interior, que lo necesite mediante la ALL RESET para guardar los datos.
    istringstream record; //修改,外层while定义
    while (getline(cin, line))
    {
        PersonInfo info;
        record.clear();   //修改,将record的状态复位
        record.str(line); //修改,保存数据
        record >> info.name;
        while (record >> word)//内层while
        {
            info.phones.push_back(word);
        }
        people.push_back(info);
    }

El derecho a modificar:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
struct PersonInfo
{
    string name;
    vector<string> phones;
};

int main()
{
    string line, word;
    vector<PersonInfo> people;
    istringstream record; //修改,外层while定义
    while (getline(cin, line))
    {
        PersonInfo info;
        record.clear();   //修改,将record的状态复位
        record.str(line); //修改,保存数据
        record >> info.name;
        while (record >> word) //内层while
        {
            info.phones.push_back(word);
        }
        people.push_back(info);
    }

    for (auto &a1 : people)
    {
        cout << a1.name << " ";
        for (auto &a2 : a1.phones)
        {
            cout << a2 << " ";
        }
        cout << endl;
    }

    return 0;
}

salida:
Los resultados operativos

3. Resumen

  1. Usted debe comprobar primero el estado previo a la utilización de una corriente.
  2. Una vez que se produce un error de corriente, no se puede leer o escribir datos.
Publicado 77 artículos originales · ganado elogios 25 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_34801642/article/details/104971575
Recomendado
Clasificación