我正在编写简单的代码,它将从文件中提取一堆名称、整数对。我正在修改仅使用的现有代码:
string chrom;
unsigned int size;
while ( cin >> chrom >> size ) {
// save values
}
但是我想使用另一个(类似的)输入文件,它具有相同的前两列,但后面是其他数据(将被忽略)。所以我写:
string chrom;
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}
但这无法编译,给出典型的淫秽 std lib 模板喷射:
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有效,为什么我的代码不起作用?
Update: Another point of reference: the temporary stringstream works when the first value extracted is an int instead of a string:
unsigned int chrom; // works as int...
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}