我在计算二进制文件中的“项目”数量时遇到了麻烦。C

I have a trouble in counting amount of "items" in binary file. C

提问人:Pentakorr 提问时间:6/3/2023 最后编辑:Pentakorr 更新时间:6/3/2023 访问量:32

问:

我想使用 feof 和 fseek 函数计算二进制文件中“项目”的数量。 我有一个二进制文件,里面有字符中的人名和浮动中的薪水。 在每个名称之前都有一个 int,表示名称中的字符数量。 例如,我的文件可能看起来像这样(但没有空格和 \0): 5丹尼5000.00 4莱娜2500.50

例如,一个项目是“4LENA2500.50”。

在我的代码中,while 循环不会停止。 我能做些什么来修复问题?

谢谢!

int count_items(FILE* file)
{
    int count=0;
    int curr_name_len;
    while (!feof(file))
    {
        fread(&curr_name_len, sizeof(int), 1, file);
        fseek(file, (curr_name_len * sizeof(char)) + sizeof(float), SEEK_CUR);
        count++;
    }
    rewind(file);
    return count;
}
C 文件 binaryfiles fseek feof

评论

0赞 Marcus Müller 6/3/2023
你试过调试什么?一个好主意可能是使用调试器并检查您在每次迭代中读取的整数。
0赞 Marcus Müller 6/3/2023
另外,我假设 5 in 是值为 5 的 bye,而不是显示该字符的 ASCII 字符,对吧?如果是这样的话,你的例子就具有误导性。如果不是这种情况,则您的代码是错误的。5danny'5'
0赞 Pentakorr 6/3/2023
fread(&curr_name_len, sizeof(int), 1, 文件);在前 2 次迭代中有效:第一次迭代是 5,第二次迭代是 4,然后 while 循环应该中断,但之后在下一次迭代中继续为 4。文件中的值 5 为 int。我知道代码是错误的,因此我写了这个问题。我寻求帮助以了解它有什么问题以及如何解决它。
1赞 Pentakorr 6/3/2023
fseek 值在每次迭代中为 0

答:

0赞 caulder 6/3/2023 #1

feof不检查文件是否在 EOF 上,而是检查文件的 eOF 指示器是否在上一个操作中设置。 允许搜索任意位置(如果操作系统和文件系统支持此功能),以允许在文件内部使用孔进行写入,如果您打算在两者之间写入内容,这将非常有用。 因此,eof-指示器是在 -call 之后设置的,但在 -call 之后被清除。 所以这应该有效:fseekfreadfseek

int count_items(FILE* file)
{
    int count=0;
    int curr_name_len;
    for (fread(&curr_name_len, sizeof(int), 1, file);
         !feof(file);
         fread(&curr_name_len, sizeof(int), 1, file))
    {
        fseek(file, (curr_name_len*sizeof(char))+sizeof(float), SEEK_CUR);
        count++;
    }
    rewind(file);
    return count;
}

或者,如果您不喜欢这种风格:

int count_items(FILE* file)
{
    int count=0;
    int curr_name_len;

    fread(&curr_name_len, sizeof(int), 1, file);
    while (!feof(file))
    {
        fseek(file, (curr_name_len*sizeof(char))+sizeof(float), SEEK_CUR);
        count++;
        fread(&curr_name_len, sizeof(int), 1, file);
    }
    rewind(file);
    return count;
}

或结构较少,但更清晰:

int count_items(FILE* file)
{
    int count=0;
    int curr_name_len;

    while (true);
    {
        if (sizeof(int) != fread(&curr_name_len, sizeof(int), 1, file)))
        {
            break;
        }

        fseek(file, (curr_name_len*sizeof(char))+sizeof(float), SEEK_CUR);
        count++;
    }

    if (feof(file))
    {
        rewind(file);
        return count;
    }

    if (ferror(file))
    {
        /* error handling */
    }
    else
    {
        /* fatal error handling */
    }
}