0

我试图在我的子程序中写入我的文件时卡住了。

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 中工作正常,只是在涉及子程序/功能时它不起作用。据我了解,它认为结果未声明,所以我是否必须传递文件的名称或位置才能使其工作?

4

3 回答 3

1

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

从它的外观上看,您已经打开了一个文件(流),就像results在 main 中一样。如果是这样,它只存在于 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 -Wall -Wextra -pedantic -o my_prog my_source.c

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

然后用 valgrind 运行它:

$ valgrind ./my_prog

这两个步骤将为您提供很多提示和线索,以找出可能出错的地方。

于 2012-04-12T23:25:44.253 回答
1

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

#include <stdio.h>

靠近源文件的顶部。

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

使变量成为全局变量(即,在任何函数之外定义,包括main)通常results是一种糟糕的风格,但如果FILE*您将在整个程序中使用它,那么将其设为全局变量并非不合理。

于 2012-04-12T23:27:56.387 回答
0

这里有不止一种解决方案。

  1. 您可以将文件处理程序传递给函数。
  2. 您可以使用 printf 写入文件。但是,如果您这样做,您将无法再次写入屏幕。免费搜索
于 2012-04-12T23:17:59.053 回答