从文件中读取错误(0或“”值已读取)

时间:2012-10-22 20:36:29

标签: c++ string file constructor stream

这是我班级的定义:

class BPP
{
    unsigned            n;                  /* nº de instancias */
    vector<string>      nombre_instancia;   /* nombre de la instancia*/
    vector<unsigned>    n_objetos;          /* nº de objetos a almacenar en cada instancia */
    vector<unsigned>    C;          /* capacidad máxima de cada contenedor */
    vector<unsigned>    mejor;              /* mejor nº mínimo de contenedores usados (m*) */
    vector< vector<unsigned> > tam_objeto;

这是我的完整构造函数:

BPP :: BPP(char fich1[])
{
    ifstream file1; string str; unsigned a, b, c, d;
    file1.open(fich1);
    if (file1.is_open()){ 
        file1 >> (unsigned &) n;
        for (unsigned k = 0 ; k < n ; ++k){
            getline(file1, str); nombre_instancia.push_back(str);
            file1 >> a; n_objetos.push_back(a);
            file1 >> b; C.push_back(b);
            file1 >> c; mejor.push_back(c);
            for (unsigned h = 0 ; h < a ; ++h){
                file1 >> d; tam_objeto[k].push_back(d);
            }
        }
    }
    file1.close();
}

fich1中的第5行是:

10
 P_0 /*Notice the space in the beginning of the line, and in the end*/
150 120 52
30
34

输出的所有值都是0(如果是无符号)或“”(如果是字符串)

1 个答案:

答案 0 :(得分:1)

问题是10之后的新行字符消耗:

file1 >> (unsigned &) n; // Why the cast here?

这意味着getline(file1, str)调用仅读取换行符,即空行。下一个输入操作是:

file1 >> a;

失败,因为P_0不是有效unsigned int。此失败会阻止对file1流进行任何进一步读取(设置其failbit)。 要解决此问题,您只需简单地调用getline()两次,忽略第一次调用的结果。

检查所有读取的结果以检测故障。这样做会提醒您读取失败。