0

これは私のクラスの定義です:

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 (符号なしの場合) または "" (文字列の場合) です。

4

1 に答える 1

1

問題は、の後の改行文字が次のものによって消費され10ないことです。

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

これは、getline(file1, str)呼び出しが改行文字 (空行) のみを読み取ることを意味します。次の入力操作は次のとおりです。

file1 >> a;

P_0が有効ではないため失敗しますunsigned int。この失敗により、file1ストリームからそれ以上読み取ることができなくなります (フェイルビットが設定されます)。解決するには、最初の呼び出しの結果を無視して、単純にgetline()2 回呼び出します。

すべての読み取り結果をチェックして、障害を検出します。そうすることで、読み取りの失敗が警告されます。

于 2012-10-22T20:55:20.190 に答える