Игнорировать все после «#»

Итак, я пытаюсь прочитать из файла. И если в середине строки или где-то еще есть знак «#», я хочу игнорировать оставшуюся часть строки и продолжать читать. Вот что у меня есть:

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» и читает построчно.

Любая помощь высоко ценится!!!

1

Решение

Вы могли бы сократить свою строку в первый раз '#' (если он присутствует) во время создания istringstream, Это позволит вам упростить остальную часть вашей логики, делая вид, что '#' никогда не бывает

while(getline(pgmFile, temp))
{
size_t pos = temp.find('#');
istringstream readIn(pos == string::npos ? temp : temp.substr(0, pos));
lines++;
...
}

Поскольку вы читаете построчно, а разделитель отбрасывается, вы можете спокойно пропустить проверку '\n' характер тоже: его там не будет.

2

Другие решения

Двойная строка getline (одна для строки, другая для игнорирования всего, что начинается с ‘#’):

#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;
}
1