子程序中的fprintf()

时间:2012-04-12 23:12:24

标签: 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]
  

“错误:'结果'未声明(首次使用此功能)”

主fprintf中的

工作得很好,就它所涉及的子程序/功能来说它不会起作用。根据我的理解,它认为结果是未声明的,所以我必须传递文件的名称或位置才能使其有效吗?

3 个答案:

答案 0 :(得分:1)

除非results是全局的,否则它是未定义的。

从它的外观来看,你在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等):

#include <stdio.h>

void foo(FILE * fp)
{
    fprintf(fp, "HELLO\n");
}

int main(void)
{
    FILE *fp;

    fp = fopen("blabla", "w");
    foo(fp);
    fclose(fp);

    return 0;
}

也;你说你的编译器没有抱怨。你在使用广泛的警告吗?如果没有,你应该。即GCC:

  

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

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

然后用valgrind运行它:

  

$ valgrind ./my_prog

这两个步骤将为您提供许多提示和线索,以防止出现问题。

答案 1 :(得分:1)

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

#include <stdio.h>

靠近源文件的顶部。

results错误不同;您可以将其设为全局或将其作为参数传递给new_page函数。

使变量成为全局变量(即,在任何函数之外定义,包括main)通常是较差的样式,但如果resultsFILE*,那么您将在整个过程中使用你的计划,让它成为全球性并非没有道理。

答案 2 :(得分:0)

这里有一个以上的解决方案。

  1. 您可以将文件处理程序传递给函数。
  2. 您可以使用printf写入文件。但如果你这样做,你就无法再次写入屏幕。搜索freopen