1

所以我试图从文件中读取。如果一行中间或任何地方有一个“#”,我想忽略该行的其余部分,继续阅读。这就是我所拥有的:

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 是“字符串”类型,它是逐行读取的。

任何帮助深表感谢!!!

4

2 回答 2

2

您可以在'#'构造istringstream. 这将让您通过假装'#'永远不存在来简化其余的逻辑:

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

由于您逐行阅读,并且由于分隔符被丢弃,因此您也可以安全地跳过对'\n'字符的检查:它不会在那里。

于 2013-09-26T20:40:14.083 回答
1

一个双 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;
}
于 2013-09-26T21:10:57.237 回答