在'#'之后忽略一切

时间:2013-09-26 20:34:52

标签: c++ skip chars

所以我试图从一个文件读入。如果在一行中间有一个'#',或者就此而言,我想忽略该行的其余部分,并继续阅读。这就是我所拥有的:

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”,它是逐行读取的。

非常感谢任何帮助!!!

2 个答案:

答案 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;
}