1

ファイルからベクトルに値を読み込もうとしています

std::vector<float> setTimesArray (std::string flName){
    int i=0, dummy=0;
    float temp;
    std::vector<float> pObs;
    std::string line;
    std::ifstream inFile;
    inFile.open(flName.c_str());
    if(!inFile){
        std::cout<<"\n.obs file not valid. Quitting programme...";
        exit(1);
    }
    while(inFile.good()){
        i++;
        getline(inFile, line);
        if(i>=3){ //I don't want first two lines
            std::istringstream in(line);
            in>>dummy;//discards first value in the line
            in>>temp;
            pObs.push_back(temp);
            in.str(""); //discards remaining part of the line
        }        

    }
    return pObs;
    inFile.close();    
}

問題は、最後の値が繰り返されることです。たとえば、flName には合計 975 行あります。したがって、pOb は size=973 (975-2 の最初の行) である必要があります。しかし、サイズは 974 で、最後の値が繰り返されていることがわかります。私が犯した間違いは何ですか?

4

2 に答える 2

4

試す:

while (getline(inFile,line))

代わりに、メソッド内から呼び出しwhile(inFile.good()) を削除します。getline()

Daniel Kamil Kozar の提案に従って、コードの最後の 2 行を次のように変更することもできます。

inFile.close();
return pObs;
于 2013-08-14T21:51:18.127 に答える
0

最後の行の後good()でも、 を返すことができtrueます。読み取りが失敗するまで戻る必要はありません。falseしたがって、true を返し、読み取りに失敗した場合、line変数は新しい値を取りません。正しい解決策はおそらく境界チェックを修正することですが、この場合、宣言をループlineのスコープに移動し、空の文字列をチェックすることで問題を修正する必要があります。while

于 2013-08-14T21:53:26.003 に答える