我正在尝试将前N个素数的数组写到txt文件中,每行5个条目,每个条目之间有10个空格。相关代码如下:
#include<stdio.h>
#include<math.h>
#define N 1000
...
void writePrimesToFile(int p[N], char filename[80])
{
int i;
FILE *fp = fopen(filename, "w");
for(i = 0; i<=N-1; i++)
{
for(i = 0; i<5; i++)
{
fprintf(filename, "%10%i", p[i]);
}
printf("/n");
fclose(fp);
}
printf("Writing array of primes to file.\n");
}
编译器抛出以下错误:
primes.c:40:4: warning: passing argument 1 of ‘fprintf’ from incompatible pointer type [enabled by default]
fprintf(filename, "%10%i", p[i]);
^
In file included from /usr/include/stdio.h:29:0,
from primes.c:1:
/usr/include/stdio.h:169:5: note: expected ‘struct FILE *’ but argument is of type ‘char *’
int _EXFUN(fprintf, (FILE *, const char *, ...)
^
许多Google搜索都没有取得丰硕的成果。任何帮助将不胜感激。
在允许使用fp之前测试fopen()
的输出:
FILE *fp = fopen(filename, "w");
if(fp)//will be null if failed to open
{
//continue with stuff
//...
}
fprintf(...)的第一个参数也是FILE *
类型。更改:
fprintf(filename, "%10%i", p[i]);
^^^^^^^^
到
fprintf(fp, "%i", p[i]);
^^//pointer to FILE struct
您必须使用打开文件时获得的FILE *
。
fprintf(fp, "%10%i", p[i]);
错误消息指出fprintf
函数需要的是FILE *
,而不是char *
(或者相同的是char[]
)。
对。当您调用fprintf时,C编译器看到的所有内容都是字符串文字(char*
),并且并非旨在推断字符串引用文件名。这就是fopen的目的。它为您提供了一种特殊类型的指示打开文件的指针。请注意,您的代码在打开文件后实际上不会对fp进行任何操作,除非将其关闭。因此,您只需在调用fprintf时用fp
代替filename
。
应检查fopen的返回值。
应该是:
fprintf(fp, "%10d", p[i]);
应将fclose从外部for循环中移出。