所以我试图从一个文件读入。如果在一行中间有一个'#',或者就此而言,我想忽略该行的其余部分,并继续阅读。这就是我所拥有的:
while(getline(pgmFile, temp))
{
istringstream readIn(temp);
lines++;
while(readIn >> convert)
{
//cout << temp[counter] << endl;
if (temp.length() == 0 || temp[counter] == '#' || temp[counter] == '\r' || temp[counter] == '\n')
{}
else
{/*cout << temp << endl;*/}
if(temp.at(counter) == '\n' || temp.at(counter) == '\r')
{}
if(convert < 57 || convert > 40)
{
pixels.push_back(convert);
}
}
对于此输入文件:
P5
4 2
64
0 0 0 0 # don't read these: 1 1 1 1
0 0 0 0
它应该在0中读取,但在#。
之后没有temp的类型为“string”,它是逐行读取的。
非常感谢任何帮助!!!
答案 0 :(得分:2)
您可以在构建'#'
时在第一个istringstream
(如果存在)剪切字符串。这可以让你假装'#'
永远不存在来简化逻辑的其余部分:
while(getline(pgmFile, temp))
{
size_t pos = temp.find('#');
istringstream readIn(pos == string::npos ? temp : temp.substr(0, pos));
lines++;
...
}
由于你逐行阅读,并且因为分隔符被丢弃,你可以安全地跳过对'\n'
字符的检查:它不会在那里。
答案 1 :(得分:1)
双重获取线(一条用于线,一条用于忽略从'#'开始的任何内容):
#include <iostream>
#include <sstream>
int main() {
// Ignoring P5
std::istringstream pgmFile(std::string(
"4 2\n"
"64\n"
"\n"
"0 0 0 0 # don't read these: 1 1 1 1\n"
"0 0 0 0\n"));
std::string line;
while(getline(pgmFile, line)) {
std::istringstream line_stream(line);
std::string line_data;
if(getline(line_stream, line_data, '#')) {
std::istringstream data_stream(line_data);
int pixel;
// Here I omitted additional error checks for simplicity.
while(data_stream >> pixel) {
std::cout << pixel << ' ';
}
}
}
std::cout << std::endl;
return 0;
}