22

これらのスレッドは私に答えません:

文字列ストリームのリセット

stringstream 変数をクリアするにはどうすればよいですか?

std::ifstream file( szFIleName_p );
if( !file ) return false;

// create a string stream for parsing

std::stringstream szBuffer;

std::string szLine;     // current line
std::string szKeyWord;  // first word on the line identifying what data it contains

while( !file.eof()){

    // read line by line

    std::getline(file, szLine);

    // ignore empty lines

    if(szLine == "") continue;

    szBuffer.str("");
    szBuffer.str(szLine);
    szBuffer>>szKeyWord;

szKeyword常に最初の単語が含まれ、szBufferリセットされません。stringstream の使用方法に関する明確な例はどこにも見つかりません。

回答後の新しいコード:

...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...

わかりました、それが私の最終バージョンです:

std::string szLine;     // current line
std::string szKeyWord;  // first word on the line identifying what data it contains

// read line by line

while( std::getline(file, szLine) ){

    // ignore empty lines

    if(szLine == "") continue;

    // create a string stream for parsing

    std::istringstream szBuffer(szLine);
    szBuffer>>szKeyWord;
4

6 に答える 6

34

clear()を呼び出した後、ストリームしませんでしたstr("")この回答をもう一度見てください。また、を使用してリセットする必要がある理由も説明していますstr(std::string())。あなたの場合、のみを使用して内容をリセットすることもできますstr(szLine)

を呼び出さないとclear()、ストリームのフラグ ( などeof) がリセットされず、驚くべき動作が発生します;)

于 2012-08-24T15:28:16.603 に答える
10

それはあなたがそれで何をしているかによって異なります。通常、新しいistringstreamorを作成する方が簡単ostringstreamです。ストリームを「リセット」するには、そのバッファをクリアし、エラー フラグをすべてクリアし、フォーマット フラグに加えて精度と塗りつぶしをリセットimbueし、元のロケールで再設定し、返された値で生成された拡張フォーマット情報を忘れないようにする必要があります。xalloc. 要するに、正しく取得することは不可能です。

そして、私がそうしている間、あなたのループは間違っていて、おそらく最後の行が2回処理されることになります. file.eof()入力が失敗した後にのみ使用可能な意味を持ちます (それでも、100% 信頼できるわけではありません)。あなたが望むのは:

std::string line;
while ( std::getline( file, line ) ) {
    if ( !line.empty() ) {
        std::istringstream buffer( line );
        //  ...
    }
}

(実際には、空のテストの前に、行の末尾の空白を削除することをお勧めします。)

于 2012-08-24T15:46:59.703 に答える
3

ss は文字列ストリームです。使用する

  • 最初のステップ: ss.clear();
  • 2 番目のステップ: ss.str("");

文字列ストリームを再利用するには、文字列ストリームを完全にクリアします。

于 2015-12-30T23:09:46.340 に答える
1

ほとんどの場合、同じものをリセットするよりも、新しいistringstreamorを作成する方が簡単です。ostringstream

ただし、再送信する場合は、次のようにします。

  • を使用してストリームのフラグを再送信します (予期しない動作を回避するため) clear ()

  • を使用して内容を修正することはできますが、効率のために をstringstream使用することをお勧めします。str ("")str(std::string())

于 2016-01-03T19:13:15.570 に答える
0

設定ファイルを想像してください。

par1=11
par2=22

コード:

std::string line, strpar1, strpar2;
int par1, par2;
std::ifstream configfile("config.cfg");

std::getline(configfile, line);    // first line to variable "line"
std::istringstream sline(line);
while (std::getline(sline, strpar1, '='));
par1 = std::stoi(strpar1);  // par1 get 11

bool b = sline.eof(); // true

std::getline(configfile, line);    // second line to variable "line"
sline.clear();    //
sline.str(line);    // reuse "sline"

b = sline.good();  // true  // goodbit is zero, indicating that none of the other bits is set.
b = sine.fail();  // false
b = sline.bad();  // false
b = sline.eof(); // false

while (std::getline(sline, strpar2, '='));
par2 = std::stoi(strpar2);  // par2 get 22

goodbit は 0 で、他のビットが設定されていないことを示します

于 2018-06-20T06:30:31.670 に答える