Чтение массива из двоичного файла в c возвращает неправильные значения - PullRequest
0 голосов
/ 28 декабря 2018

Я только начал изучать файлы на языке 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 голосов
/ 28 декабря 2018

Проблема в том, что вы пишете в файл, используя 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 записывает двоичное представление целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...