【问题标题】:Fprintf doesnt write array to fileFprintf 不将数组写入文件
【发布时间】:2018-12-27 21:18:48
【问题描述】:

我有一个代码应该读取一个数组,将其写入二进制文件和文本文件,然后打印文件。但是,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 个错误。试图扫描到v[0]v[1],...v[n-1]v[n];但v[n] 不存在。
  • int i=0;i&lt;=n;i++ 应该是int i=0;i&lt;n;i++ 从数组中写入 1 个值
  • 尝试perror打印错误原因(基于errno的值);大多数标准库函数在失败时设置errno
  • 谢谢。修改了还是不行
  • 我强烈建议您在编译时启用所有警告,并将任何警告视为错误。我希望大多数编译器会警告分配错误。诚然,警告信息可能有点晦涩难懂,可能类似于“从整数到指针的转换”,但它至少会指出出现问题的行。在这种情况下,首先要做的就是删除任何你不确定的东西,这可能包括链接多个不带括号的运算符。

标签: c arrays file printing


【解决方案1】:

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

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++) { 

数组vn 元素,这意味着它的索引从0n-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");

【讨论】:

  • 同意,这就是我说的fopen,很奇怪她没有看到她甚至无法打开输入文件
  • 我没有收到任何错误,我忽略了括号。谢谢。
  • @MaryPoppins 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多