我正在尝试理解文件i / o技术的一些差异。假设我有以下代码:
FILE *work_fp;
char record[500] = {0};
while(!feof(work_fp))
{
static int first = 1;
fgets(record, 200, work_fp);
if (first)
{
var1 = 2;
length += var1;
}
first = 0;
if (feof(work_fp))
{
continue;
}
if((int)strlen(record) < length)
{
fclose(work_fp);
std::ostringstream err;
err << "ERROR -> Found a record with fewer bytes than required in file."
<< std::endl;
throw std::runtime_error(err.str());
}
const int var2 = 1;
if(memcmp(argv[1], record + var2, 3) == 0)
{
load_count_struct(record, var1);
}
}
我没有看到第二个if
参数如何成真。
if (feof(work_fp))
{
continue;
}
如果feof(work_fp)
为真,那么while
参数不会为假吗?然后继续永远不会被召唤?
关注问题:
好的,我看到fgets
如何导致work_fp
达到eof
条件。
假设我想尝试以另一种方式实现。例如,使用getline()
。
std::string data(file);
std::ifstream in(data.c_str());
if (!in.is_open())
{
std::ostringstream err;
err << "Cannot open file: " << file << std::endl;
throw std::runtime_error(err.str());
}
std::string buffer = "";
std::string record = "";
while (getline(in, buffer))
{
static int first = 1;
if (first)
{
var1 = 2;
length += var1;
}
first = 0;
if (//What should go here?!?)
{
break;
}
// etc...
}
有什么建议吗?我在想
if (buffer == std::string::npos)
没有
答案 0 :(得分:5)
该行:
fgets(record, 200, work_fp);
可以提前读/写头到文件末尾,从而更改feof
上的返回值。
答案 1 :(得分:4)
首先,您的代码会调用未定义的行为,因为您尚未初始化work_fp
,但您正在使用它,将其传递给feof()
,首先是while(!feof(work_fp))
以及代码中的其他位置。
无论如何,假设你通过打开一些文件来初始化它,那么我会按如下方式回答你的问题:
以下代码使用work_fp
从文件中读取一些数据,这意味着feof(work_fp)
可能会在第二个if
条件下返回true,因为在使用{读取数据后{1}},文件指针fgets()
可能会到达文件末尾。
work_fp
答案 2 :(得分:1)
在while循环中调用fgets()
并且文件指针前进。然后if(feof(work_fp))
检查是否到达文件末尾。如果是,则继续while循环。如果未到达文件末尾,则while循环继续,在这种情况下将为false。因此逻辑有效。
答案 3 :(得分:1)
这是一个奇怪的陈述,我认为它应该是
if (feof(work_fp)){
break;
}
continue;
可以被调用,因为它发生在fgets之后,但是调用continue
是没有意义的,因为它将执行带到循环的下一次迭代,保证为false
并退出循环。它更有意义,并且更容易将break;
放在那里。
答案 4 :(得分:0)
由于你在检查feof之前的某段时间内有一个fgets,work_fp的feof状态可能在读取期间发生了变化,在这种情况下,它可能会评估为true。
答案 5 :(得分:0)
work_fp
和while
条件之间的if
有一个读取操作,因此feof()
可能为真。
答案 6 :(得分:0)
可以通过以下行找到eof:
fgets(record, 200, work_fp);
因此在while语句中被评估为false之后。
这将成为
if (feof(work_fp))
评估为真。 但是这段代码可以简化。