1

这可能是微不足道的问题。我不是一个专业的程序员,我是一个正在使用 C 做一些数值实验的数学家。我希望我的实验的输出被写在不同的文件中,用于不同的参数值。MWE 应该做这样的事情。创建一个由 i 索引的文件指针。打开一个名为 file[i] 的文件。将 i 写入该文件,然后将其关闭。下面的代码显然无法编译。这样的建筑甚至可能吗?

#include<stdio.h>
int i;

int 
main()
{
        for (i = 0; i < 10; i++){
                FILE *f(i);
                f(i)=fopen("file"[i],"w");
                fprintf(f(i),"%d \n", i);
                fclose(f(i));  
        }
    return 0;
}

编辑:我得到了几个不错的答案,但有人可以帮助解决 sprintf 问题。即不推荐在我使用 sprintf 的 OpenBSD 上。所以我收到了这条消息

$ gcc test.c
/tmp//ccN31aTv.o(.text+0x41): In function `main':
: warning: sprintf() is often misused, please use snprintf()

当我用 snprintf 替换 sprintf 时,我收到各种警告

$ gcc test.c
test.c: In function 'main':
test.c:9: warning: passing argument 2 of 'snprintf' makes integer from pointer without a cast
test.c:9: warning: passing argument 3 of 'snprintf' makes pointer from integer without a cast

对我来说,这看起来不是一个高质量的代码。

最终解决方案:我只想记录最终解决方案。ProPolice 和 systrace 对 OpenBSD 上的这段代码很满意。感谢所有帮助过的人!

#include<stdio.h>
int i;

char buf[20];

int
main()
{
        for (i = 0; i < 10; i++){
                snprintf(buf, sizeof(buf), "filename%d", i);
                FILE *f = fopen( buf, "w");
                fprintf(f,"%d \n", i);
                fclose(f);
        }
return 0;
}
4

4 回答 4

4

在 C 中,使用 snprintf:

char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "file%d", i);

如果你使用 linux,有一个有用的 GNU 扩展:

char *name;
asprintf(&name. "file%d", i);

您需要记住使用后释放(名称)。

请注意,您的语法FILE *f(i);无效。

如果您需要声明一个包含 10 个元素的 FILE * 数组,请执行以下操作:

FILE *array[10];

然后像这样使用它:

array[i] = fopen(filename, "W");
于 2013-05-16T20:48:13.893 回答
2

你可以用sprintf. 确保您的缓冲区足够大:

char filename[20];
sprintf( filename, "file%d", i );

然后你可以这样打开它:

FILE *f = fopen( filename, "w");
...
fclose(f);

无需使用数组(如果这是您尝试使用的f(i)),因为您一次只打开一个文件。

如果您希望您的文件是文本可排序的,您可能需要file001file002...您可以使用0-pad%03d代替3 位数字。%d

于 2013-05-16T20:46:53.893 回答
2

用于sprintf生成文件名。

char buf[80];
sprintf(buf,"file%d", i);
fopen(buf,"w");

C 中的数组语法使用方括号[]

于 2013-05-16T20:45:16.743 回答
1

你可以试试这个:

#include <stdio.h>
#include <stdlib.h>

int main(void) {

   int i = 0;
   for (i = 0; i < 10; i++) {
      char filename[64];
      sprintf(filename, "file%d", i);    
      FILE *fp = fopen(filename, "w");
      fprintf(fp, "%d\n", i);
      fclose(fp);
   }
   return 0;
}

你的代码几乎没问题。一些观察:

  • 用于sprintf创建文件的名称。在 C 中,没有字符串的连接运算符。
  • 您不需要创建文件指针数组。
  • 当然,这可能会得到改进:处理文件名的大小、填充数字等。
于 2013-05-16T20:48:52.667 回答