从c中的二进制文件读取数组会返回不正确的值

时间:2018-12-28 08:41:57

标签: c arrays file binary

我刚开始用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);

}

1 个答案:

答案 0 :(得分:1)

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

其中fprintf代表string的{​​{1}}表示形式。 例如,当您将integers写入文件时,您正在将2写入大小为1个字节的字符串。

"2"

因此将x=fprintf(f,"%d\n",v[i]); 替换为fprintf,如下所示。

fwrite
  

fwrite(&v[i], sizeof(v[0]), 1, f); 写入整数的二进制表示形式。