0

我有一个包含以下形式的数据的文件:

ballcolor 10
bgcolor 5
[...]

我试图通过以下方式阅读:

void read (const char *filename)
{
    ifstream prefsfile (filename);
    if (prefsfile.is_open ())
    {
        char prefsline [BUFSIZE], prefname [BUFSIZE];
        unsigned int value;

        while (! prefsfile.eof ())
        {
            prefsfile.getline (prefsline, BUFSIZE);

            istringstream iss (prefsline);
            iss >> prefname >> value;
            if (! (iss.fail () || prefsfile.fail ()))
            {
                if (! strcmpi (prefname, PREFSTR_PAD_COLOR) && value <= BACKGROUND_MAX)
                {
                    color.pad = value << 4;
                }
                else if (! strcmpi (prefname, PREFSTR_BALL_COLOR) && value <= FOREGROUND_MAX)
                {
                    color.ball = value;
                }
                else if (! strcmpi (prefname, PREFSTR_FOREGROUND_COLOR) && value <= FOREGROUND_MAX)
                {
                    color.foreground = value;
                }
                else if (! strcmpi (prefname, PREFSTR_BACKGROUND_COLOR) && value <= BACKGROUND_MAX)
                {
                    color.background = value << 4;
                    color.ball |= color.background;
                }
            }
        }
        prefsfile.close ();
    }
}

如果我给它一个完全符合上面显示的格式的文件,它工作得很好。但是,如果文件不符合要求,或者每行的长度大于BUFSIZE(=30),则会进入无限循环。

我该如何解决问题?

4

1 回答 1

1

您正在检查,! prefsfile.eof ()但如果您检查更通用,prefsfile.good()如果行长于BUFSIZE.

getline 参考解释了何时设置了故障位。特别是,如果BUFSIZE从输入中读取字符的时间未找到分​​隔符。

我会像这样阅读文件:

void read (const char *filename)
{
    ifstream prefsfile (filename);
    if (prefsfile.is_open ())
    {
        char prefsline [BUFSIZE], prefname [BUFSIZE];
        unsigned int value;

        while (prefsfile.getline(prefsline, BUFSIZE))
        {                        
            if (prefsfile.eof()) {
                break;
            }

            istringstream iss (prefsline);
            iss >> prefname >> value;
            cout << prefname << " " << value << "\n";
        }
        prefsfile.close ();
    }
}

如果行太长,while循环条件将评估为假。

测试 1 - 长线打破循环

ballcolor 10
really really long line that is over 30 characters
bgcolor 5

输出:

ballcolor 10

测试 2 - 较短的行

ballcolor 10
bgcolor 5

输出:

ballcolor 10
bgcolor 5
于 2013-11-19T10:52:54.747 回答