1
std::string szKeyWord;
...
std::stringstream szBuffer(szLine);
szBuffer>>szKeyWord;
...
szBuffer<<szKeyWord;
szBuffer>>myIntVar; // will NOT format keyword here, will act as the line above never happened.

かなり自明です。最後の「>>」を元に戻して、絶対に起こらないように使いたい。

コンテキスト:キーワードをチェックしていますが、キーワードでない場合は、配列データであり、行間にコメントがある可能性があるため、データとして収集し続ける必要があります。

編集:

たくさんの試行錯誤の後、私はこれを機能させます:

szBuffer.seekg((int)szBuffer.tellg() - (int)szKeyWord.length());

私にはエレガントに見えませんが、うまく機能しているように見えます。

4

1 に答える 1

0

次のようなことを試してください:

using namespace std;

string PeekString(stringstream& ss, int position = 0, char delim = '\n', int count = 0)
{
    string returnStr = "";
    int originalPos = (position > 0) ? position : ss.tellg();
    if (originalPos == position) ss.seekg(position);
    int pos = originalPos;
    int i = 0, end = (count < 1) ? ss.str().length() : count;
    char c = ss.peek();

    while (c != delim && !ss.eof() && i != end)
    {
        returnStr += c;
        pos++;
        i++;
        ss.seekg(pos);
        c = ss.peek();
    }
    ss.seekg(0);
    return returnStr;
}

使用法は次のようになります。

int main()
{
    string s = "Hello my name is Bob1234 68foo87p\n";
    stringstream ss;
    ss << s;
    cout << "Position 0, delim \'\\n\': " << PeekString(ss) << endl;
    cout << "Position 0, delim \' \': " << PeekString(ss,0,' ') << endl;
    cout << "Position 17, delim \' \': " << PeekString(ss,17,' ') << endl;
    cout << "Position 25, delim \'\\n\': " << PeekString(ss, 25) << endl;
    cout << "Position 27, count 3: " << PeekString(ss, 27, '\n', 3) << endl << endl;

    string newstring;
    char temp[100];
    ss.getline(temp, 100);
    newstring = temp;

    cout << "What's left in the stream: " << newstring;

    cin.get();
    return 0;
}

出力は次のようになります。

  • 位置 0、delim '\n': こんにちは、私の名前は Bob1234 68foo87p です
  • 位置 0、delim ' ': こんにちは
  • 位置 17、delim ' ': Bob1234
  • 位置 25、delim '\n': 68foo87p
  • 位置 27、カウント 3: foo

  • ストリームに残っているもの: こんにちは、私の名前は Bob1234 68foo87p です

于 2012-12-14T12:19:20.950 に答える