2

1.2345foo次の例では、それが解析されるとは思っていませんでした。私はデータファイルを読んでいるので、エラーを発生させてユーザーに通知する方がおそらく良いでしょう。

peek()ここで行うべき正しいことはありますか?

#include <iostream>
#include <sstream>

int main()
{
  std::stringstream in("1.2345foo");

  double x;

  in >> x;

  if (in) {
    std::cout << "good\n";
  }
  else {
    std::cout << "bad\n";
  }
}

出力

good
4

2 に答える 2

2

として読み取る最も簡単な方法でstd::string、を使用std::stodしてをに変換std::stringdoubleます。変換関数は、渡したときなど、無効な入力に対して例外をスローします"1.2345foo"

于 2012-11-20T17:01:09.790 に答える
2

次のキャラクターを先読みしてください。孤立した場合、次のstd::istringstreamようなことができます。

if ( in >> x && in.get() == std::string::traits_type::eof() ) {
    //  good
} else {
    //  bad
}

(私は通常、より意味のあるエラーメッセージを表示するために、テストを分離するのが好きです。)

たとえば"1.2345 foo"合法であるが合法では"1.2345foo"ない、より大きなファイルのデータに関心がある場合は、次のような先読みを使用できます。

if ( in >> x 
        && (std::isspace( in.peek() )
            || in.peek() == std::string::traits_type::eof())  ) {
    //  good
} else {
    //  bad
}

編集:

言及するのを忘れました:最初のケースでは、eofをチェックする前に空白をスキップしたいかもしれません:

if ( in >> x >> std::ws && in.get() == std::string::traits_type::eof() ) ...

(私はこれを頻繁に行います。文字列入力がからstd::getlineの場合、ファイルを見ている人には見えないので、末尾の空白を許可する必要があります。)

于 2012-11-20T18:34:30.717 に答える