私はファイルから名前とintのペアの束を抽出する簡単なコードを書いています。以下を使用する既存のコードを変更しています。
string chrom;
unsigned int size;
while ( cin >> chrom >> size ) {
// save values
}
しかし、最初の2つの列が同じで、その後に他のデータが続く(無視される)別の(類似した)入力ファイルを使用したいと思います。だから私は書く:
string chrom;
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}
しかし、これはコンパイルに失敗し、典型的なわいせつなstdlibテンプレートを吐き出します。
error: no match for "operator>>" in "std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >(((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& line))), std::operator|(_S_out, _S_in)) >> chrom"
istream:131: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
[...another dozen lines...]
右。lineはstd::stringではありませんが、std :: basic_stringなどのバリエーションです。ただし、stringstreamの明示的なインスタンス化は機能します。
string chrom;
unsigned int size;
string line;
while ( getline(genome, line) ) {
stringstream ss(line);
if ( ss >> chrom >> size ) {
// save values
}
// Discard remainder of line
}
なんで?最初のケースの何が問題になっていますか?常に役立つcplusplus.comのサンプルbasic_ioが機能しますが、なぜ私のコードが機能しないのですか?
更新:別の参照ポイント:一時的な文字列ストリームは、抽出された最初の値が文字列ではなくintである場合に機能します。
unsigned int chrom; // works as int...
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}