【问题标题】:Reading an array from a binary file in c returns incorrect values从 c 中的二进制文件读取数组返回不正确的值
【发布时间】:2019-05-26 02:45:07
【问题描述】:

我刚开始学习 c 语言文件,但我的代码有问题。它在二进制文件中写得很好,但是当我试图读回这些值时,它会返回一个少一个值和数组的不同值。 我知道我可能犯了一个愚蠢的错误,如果你能帮助我理解我会很感激。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()

{
    FILE *f;
    if ((f=fopen("fis.bin","wb"))==NULL)
    {
        printf ("Error\n");
        exit(1);
    }

    int *v;
    int n,x;
    char s[100];
    scanf("%d",&n);
    v=(int*)malloc(n*sizeof(int));

    for (int i=0; i<n; i++)
    {
        scanf("%d",&v[i]);

        x=fprintf(f,"%d\n",v[i]);
        if (x<0)
            perror("Error:");
    }
    fclose(f);

    int *cit;

    cit=(int*)calloc(n,sizeof(int));

    if ((f=fopen("fis.bin","rb"))==NULL)
    {
        printf ("Error\n");
        exit(1);
    }
    fseek(f,0,SEEK_END);

    int sz = ftell(f)/sizeof(v[0]);

    fseek(f,0,0);

    int i=0;

    if(!fread(cit,sizeof(int),sz,f))
        perror("err: ");

    for (i=0; i<sz; i++)
        printf("%d\n",cit[i]);



    printf("\n");

    free(v);
    free(cit);


    fclose(f);

}

【问题讨论】:

  • 如果我们有文件,我想我们可以提供帮助。
  • 好吧,无论文件中的值如何,输出都是相同的。我只尝试了 3 个值,并且 sz 返回 2 而不是 3 。不知道为什么
  • int sz = ftell(f)/sizeof(v[0]); 不适合您的要求,因为 ftell 以字节为单位返回位置,考虑您已编写 1 2 3 4 ftell 返回 7 但您想要的是 16 字节。
  • 阅读每个使用函数的文档(例如scanf)。阅读how to debug small programs
  • 您正在使用fprintf() 写入文件并使用fread() 读取相同的文件。对于int 的数组,两种格式排成一列的可能性为零。

标签: c arrays file binary


【解决方案1】:

问题是您正在使用fprintf 写入文件。

其中fprintf 写入string 表示integers。 例如,当您将2 写入文件时,您正在将"2" 写入为大小为1 字节的字符串。

x=fprintf(f,"%d\n",v[i]);

因此将fprintf 替换为fwrite,如下所示。

fwrite(&v[i], sizeof(v[0]), 1, f);

fwrite 写入整数的二进制表示。

【讨论】:

  • 谢谢。所以每次我写入二进制文件时我都应该使用 fwrite,但是当我写入文本文件时我也可以使用 fprintf?
  • @MaryPoppins 不,fprintf and fscanf 用于写入和读取格式化文本,而fwrite and fread 用于写入和读取二进制文件。只是不要混淆这些东西。
  • 好的。好吧,我有一个 txt 文件,我使用 fwrite 和 fread 在文件中写入和读取数组,并且它有效。所以这就是我问的原因..标记它,谢谢
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多