0

forループを介して1行に5つのdoubleのファイルを読み取り、それらを構造体のベクトルに格納していますが、行に5つのdoubleが少ない場合があります。ファイルは次のようになります

111.111 222.222 333.333 444.444 555.555

666.666

777.777 (空白) 888.888 999.999

struct temp_struct{
    double d1,d2,d3,d4,d5
};
vector<temp_struct> data;
for(int i=0;i<3;i++)
    File>>data.at(i).d1>>data.at(i).d2>>data.at(i).d3>>data.at(i).d4>>data.at(i).d5;

666.666 の後、777.777 と 888.888 の間の空きスペースをテストする方法はありますか。

今私が読んでいる方法では、666.666 の後、ファイルの次の行に移動し、777.777 と 888.888 999.999 を読み取るため、構造体は data.at(1).d1=666.666 data.at(1 .d2=777.777 data.at(1).d3=888.888 および data.at(1).d4=999.999

data.at(1).d1=666.666, break because of end of line 
data.at(2).d1=777.777, data.at(2).d2=0, data.at(3).d3=888.8888

私はVS2010 C++でプログラミングしています

4

1 に答える 1

1

行ベースのテキストを解析する通常の方法はstd::getline()、 と組み合わせて使用​​することです。次にstd::istringstream例を示します。

for (std::string line; std::getline(in, line); ) {
    std::istringstream lin(line);
    // parse the line using `line`
}

ただし、他のアプローチもあります。たとえば、改行の空白を考慮しないようにストリームを設定することができます。この方法では、改行が検出されたときに数値を読み取ろうとすると、値を読み取る試みは失敗します! 空白と見なされるものを変更する方法はstd::locale、カスタム バージョンの でカスタム オブジェクトをインストールすることですstd::ctype<char>

于 2013-10-06T20:03:56.297 に答える