1

だから私はcin.get()を使って文字列を2回読み込もうとしています。入力は「プログラム<入力」としてリダイレクトされています。したがって、seekg()を使用することは有効です。

タイトルにあるように、seekg()を使用して文字列の開始位置を保存できると思ったので、同じ文字列の開始位置を再び使用できるようになりました。

これが私の試みです:

char c;
while (cin.get(c))
{
  //do stuff 
}

cin.seekg(0, ios::beg);

while (cin.get(c))
{
  //do stuff with the string a second time
}

2番目のwhileループは何もしていないので、明らかにseekgを正しく使用していません。誰かが私が間違っていることを教えてもらえますか?

助けてくれてありがとう!

4

4 に答える 4

5

ストリーム/パイプをシークすることはできません。それらは記憶の中に存在し続けません。キーボードがプログラムに直接接続されていると想像してください。キーボードで実行できる唯一の操作は、さらに入力を求めることです。歴史はありません。

それが単なるキーボードの場合はシークできませんが、シェルのシークで < でリダイレクトされている場合は正常に機能します。

#include <iostream>

int main() {
  std::cin.seekg(1, std::ios::beg);
  if (std::cin.fail()) 
    std::cout << "Failed to seek\n";
  std::cin.seekg(0, std::ios::beg);
  if (std::cin.fail()) 
    std::cout << "Failed to seek\n";

  if (!std::cin.fail()) 
    std::cout << "OK\n";
}

与えた:

user@host:/tmp > ./a.out
シークに
失敗しました
user@host:/tmp > ./a.out < test.cc
OK

于 2012-08-01T18:59:58.543 に答える
4

そんなことはできません。通常、std::cin は端末に接続されているため、ランダム アクセスは問題外です。

使用していたストリームが std::istringstream または std::ifstream である場合、これを行うことができます。

私のアドバイスは、std::cin のすべての文字を単一の std::string に読み取り、その文字列から std::istringstream を作成し、std::cin の代わりにその std::istringstream で手法を試すことです。

于 2012-08-01T19:04:16.463 に答える
0

ストリームをシークすることはできませんが、 または のいずれかを使用できstd::cin.peek()ますstd::cin.unget()

1) 使用することによりcin.peek()

char c;
while (c = cin.peek())
{
  //do stuff 
}

while (cin.get(c))
{
  //do stuff with the string a second time
}

2) を使用してcin.unget()

char c;
while (cin.get(c))
{
  //do stuff 
}

cin.unget();

while (cin.get(c))
{
  //do stuff with the string a second time
}
于 2016-06-20T12:44:23.927 に答える
0

ストリームをシークすることはできません。文字をアンゲットする必要があります。

于 2012-08-01T19:00:07.440 に答える