gpt4 book ai didi

c++ - 具有文件处理和 istringstreams 的无限循环

转载 作者:行者123 更新时间:2023-11-28 07:17:05 25 4
gpt4 key购买 nike

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

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),它将进入无限循环。

我该如何解决这个问题?

最佳答案

您正在检查 ! prefsfile.eof () 但如果您检查了更通用的 prefsfile.good() 如果行长于 BUFSIZE,您的循环应该会中断。

The getline reference解释何时设置故障位。特别是,如果在从输入中读取 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 循环条件将计算为 false。

测试 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

关于c++ - 具有文件处理和 istringstreams 的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20069178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com