【问题标题】:Change a value in a binary file (C)更改二进制文件中的值 (C)
【发布时间】:2016-01-13 23:28:55
【问题描述】:

程序应该更改记录中的特定值,我使用 fseek 和 fwrite 来执行此操作。但是当我运行它时,它会覆盖下一条记录。

这是我的程序的一部分:

j = 0;
while ((fread(&Rec, sizeof(Rec), 1, file) == 1) && (Found == 0))
{
    if (strcmp(Rec.Name, SearchName) == 0)
    {
        if (Rec.BD == SearchBD)
        {
            Found = 1;
            printf("\nEnter the new value : ");
            scanf("%f", &Val);

            fseek(file, (sizeof(Rec))*j, SEEK_SET);
            strcpy(Rec.Name, SearchName);
            Rec.BD = SearchBD;
            Rec.V = Val;
            fwrite(&Rec, sizeof(Rec), 1, file);

        }

    }

    j++;
}

【问题讨论】:

  • 字符串函数在评估二进制文件中的内容时效果不佳。字符串函数仅适用于字符串,即以 NULL 字符结尾的 char 数组。如果没有 NULL,strcmp 函数将产生意想不到的结果。 Look here 进行涵盖类似请求的对话。
  • 是的,好吧,Rec、Val 等类型丢失了,所以我们不知道发生了什么。 'strcpy(Rec.Name, SearchName);'在 'if (strcmp(Rec.Name, SearchName)' 块内有点毫无意义/令人担忧:(
  • @ryyker,如果二进制文件是用 C 结构编写的,那么它们可以毫无问题地回读。 C 结构在编写时将全部包含以空字符结尾的字符数组,这些字符数组将被回读。
  • 虽然不能解决问题,但while必须写成while ((Found == 0) && (fread(&Rec, sizeof(Rec), 1, file) == 1)),否则found后面会多出一个fread
  • @MartinJames 我知道这毫无意义,我正在做额外的测试以防万一>

标签: c binaryfiles fwrite


【解决方案1】:

您的代码无法覆盖下一条记录。代码是正确的。然而,如果你在你的程序中进一步使用Rec(你只给了一个sn-p),那么你会发现Rec有意想不到的值。那是因为在找到搜索的记录之后,while 循环在退出循环之前又执行了一次fread。那是因为while循环必须写成:

while ((Found == 0) && (fread(&Rec, sizeof(Rec), 1, file) == 1))

否则将在测试found 并退出循环之前执行另一个fread。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2021-12-04
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多