【发布时间】:2013-11-19 10:37:10
【问题描述】:
我有一个包含以下格式数据的文件:
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),则会进入无限循环。
我该如何解决这个问题?
【问题讨论】:
-
如果 prefsline 的长度为 BUFSIZE,则您的 getline 语句应为
prefsfile.getline (prefsline, BUFSIZE);否则您可能会超出缓冲区的末尾。 -
@TomFenech,正如我上面所说的
BUFSIZE是 30;无论如何编辑以更正它。 -
while (! prefsfile.eof ())是错误的。谁教你这样做的?
标签: c++ fstream istringstream