C 子程序中的fprintf()

C 子程序中的fprintf(),c,function,file-io,C,Function,File Io,当我试图在子程序中写入文件时,我被卡住了 void new_page(float *a, float *b, float *c, int *d){ fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d); } 我收到警告说 Warning: incompatible implicit declaration of built-in function 'fprinf' [enabled by default] 错误:“

当我试图在子程序中写入文件时,我被卡住了

void new_page(float *a, float *b, float *c, int *d){
    fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d);
}
我收到警告说

Warning: incompatible implicit declaration of built-in function 'fprinf' [enabled by default]
错误:“结果”未声明(首次在此函数中使用)


在main中,fprintf工作得很好,只是当涉及到子程序/函数时,它就不工作了。据我所知,它认为结果是未声明的,所以我必须传递文件的名称或位置才能使其正常工作吗?

这里有多个解决方案

  • 您可以将文件处理程序传递给函数
  • 可以使用printf写入文件。但是如果你这样做了,你就不能再向屏幕上写了。搜查

  • 除非
    结果
    是全局的,否则它是未定义的

    从外观上看,您已经在main中以
    results
    的形式打开了一个文件(流)。如果是的话,它只存在于main的范围内

    将其传递给函数。不要建议将其全球化


    它看起来像:

    void new_page(FILE *results,  float *a, float *b, float *c, int *d){
        fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d);
    }
    

    还有,;如果您在一个单独的文件中有此函数,那么
    main()
    ,正如您所说的
    fprintf
    工作-您还必须在该文件中包含
    stdio.h


    编辑:听起来你在做一些错误的功能签名和原型等

    举个简单的例子(不需要对fopen等进行检查):

    #包括
    void foo(文件*fp)
    {
    fprintf(fp,“HELLO\n”);
    }
    内部主(空)
    {
    文件*fp;
    fp=fopen(“blabla”,“w”);
    foo(fp);
    fclose(fp);
    返回0;
    }
    
    还有,;你说你的编译器没有抱怨。您是否使用了广泛的警告?如果不是,你应该。Ie GCC:

    $gcc-Wall-Wextra-pedantic-o my_prog my_source.c

    我通常还会添加
    -std=c89
    ,或者如果需要,添加
    -std=c99

    然后用valgrind运行它:

    $valgrind./my_prog


    这两个步骤将为您提供许多提示和线索,说明哪里可能出错。

    要解决
    fprintf
    警告,您需要添加

    #include <stdio.h>
    
    #包括
    
    靠近源文件的顶部

    结果
    误差不同;您可以将其设置为全局,也可以将其作为参数传递给
    新页面
    函数


    将变量设置为全局变量(即,在任何函数之外定义,包括
    main
    )通常是不好的风格,但是如果
    结果
    是一个将在整个程序中使用的
    文件*
    ,将其设置为全局并不是不合理的。

    因此,要传递它,我只需在参数列表中传递一个指向该文件的指针,它应该会看到它已定义?哦,它不是全局的,我没有使用任何全局变量。是的,有点。当你像那样传递它时,你告诉函数;“您好,这是一个地址,在该地址您将找到一个文件流”。该函数位于单独的文件中。我会再试一次,看看交易是什么:我已经安排好了。对于函数原型,我必须使用FILE**,而在实际函数中,我只使用FILE*。我想既然文件已经被指向了,我不得不使用双指针。它是C,所以谁知道会发生什么,仅仅因为它没有给出错误并不意味着它会工作haharns out It not work:/编译器不再抱怨,因为参数匹配,但它不会打印到文件中。我放了一个printf在屏幕上显示im在函数中,它打印出我的文本。至于全局变量,我根本不允许在程序中使用任何变量。就像你说它的风格很差,我的老师说不赞成使用globals。@塞吉奥:那么你需要把它作为一个参数来传递。关于警告。。你是说
    fprintf()
    ?错误:在哪里声明“结果”?你能提供更多的代码吗?
    #include <stdio.h>