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

У меня есть код, который должен прочитать массив, записать его в двоичный файл и в текстовый файл, а затем распечатать файлы.Тем не менее, функция fprintf возвращает ошибку, и я понятия не имею, почему.Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{ 
    FILE *f,*b;

    if (f=fopen("fis.txt","w+")==NULL) { 
        printf ("Error\n");
        exit(1);
    }
    if(b=fopen("binar.txt","w+b")==NULL) { 
        printf ("Error\n");
        exit(1);
    }

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

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

        x=fprintf(f,"%f",v[i]); 
        if (x<0) printf("err\n");

        y=fprintf(b,"%f",v[i]); 
        if (y<0) printf ("err2\n");
    }

    fgets(s,sizeof(s),f); 
    puts(s); 
    printf("\n");

    fgets(s,sizeof(s),b);
    puts(s);
    printf("\n");

    free(v);
    fclose(f);
    fclose(b);
}

1 Ответ

0 голосов
/ 28 декабря 2018

Основная проблема заключается в том, как вы открываете файлы:

if (f=fopen("fis.txt","w+")==NULL) { 

Оператор равенства == имеет более высокий приоритет, чем оператор присваивания =.Итак, сначала результат fopen сравнивается с NULL, а затем результат этого сравнения, то есть 0 или 1, присваивается f.Таким образом, f не указывает на правильное местоположение, и именно поэтому ваши fprintf вызовы терпят неудачу.Если у вас есть предупреждения на вашем компиляторе, он должен был предупредить о назначении целого числа указателю.

Добавьте круглые скобки, чтобы получить правильный порядок:

if ((f=fopen("fis.txt","w+"))==NULL) {

И:

if ((b=fopen("binar.txt","w+b"))==NULL) { 

Кроме того, ваше условие цикла неверно:

for (int i=0;i<=n;i++) { 

Массив v имеет n элементов, то есть его индексы идут от 0 до n-1, но вы выполняете циклот 0 до n.Измените условие цикла, чтобы учесть это:

for (int i=0;i<n;i++) { 

Вам также нужно вызвать rewind для каждого файлового дескриптора, прежде чем читать их обратно, чтобы вы могли прочитать то, что только что написали:

rewind(f);
fgets(s,sizeof(s),f); 
puts(s); 
printf("\n");

rewind(b);
fgets(s,sizeof(s),b);
puts(s);
printf("\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...