Fprintf不会将数组写入文件

时间:2018-12-27 21:18:49

标签: c arrays file printing

我有一个代码,应该读取一个数组,将其写入二进制文件和文本文件,然后打印文件。但是,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 :(得分:3)

主要问题是如何打开文件:

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个元素,这意味着其索引从0n-1,但是从0n循环。更改循环条件以解决此问题:

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");