使用while语句的文件I / O逻辑,该代码将如何表现?

时间:2011-07-21 18:11:16

标签: c++

我正在尝试理解文件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)

没有

7 个答案:

答案 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_fpwhile条件之间的if有一个读取操作,因此feof()可能为真。

答案 6 :(得分:0)

可以通过以下行找到eof:

 fgets(record, 200, work_fp);

因此在while语句中被评估为false之后。

这将成为

 if (feof(work_fp))

评估为真。 但是这段代码可以简化。