我正在尝试创建一个返回文件数组的函数,但我找不到在函数外部访问该数组的方法。 这就是我的尝试:
FILE* *arquivoescrita(int k) //gerar nome de arquivo
{
char filename[sizeof("file1000000000000.txt")];
static FILE* arquivos[2];
for (int i = k; i < k+2; ++i)
{
sprintf(filename, "file%d.txt", i);
arquivos[i] = fopen(filename,"r");
}
return arquivos;
}
我正在调用main中的函数:
FILE* psaidas[2];
psaidas = arquivoescrita(0);
我得到的错误是
error: array type 'FILE *[2]' is not assignable
psaidas = arquivoescrita(0);
如何访问这种数组?
答案 0 :(得分:3)
您正在返回指向静态数组的指针。没关系。但是C不会神奇地将数组复制到另一个位置。您可以更改声明:
FILE**psaidas;
psaidas = arquivoescrita(0);
这将有效。但此时,psaidas
将指向您的static FILE *
数组。因此,如果再次致电arquivoescrita
,它将被覆盖。
如果这样做 - 它可能会起作用 - 那就继续吧。如果您在完成文件之前需要多次调用arquivoescrita
,那么您必须使用malloc
或calloc
动态分配您的结果arquivoescrita
或者您可以选择在收到后复制数组:
FILE * psaidas[2];
memcpy(psaidas, arquivoescrita(0), sizeof(psaidas));
答案 1 :(得分:0)
返回FILE **
打开文件流数组有一个问题,您需要知道实际打开的数量。您有几个选择,(1)传递指向函数的指针并更新指针以反映成功打开的文件数,或者(2)可能更有意义的是传递FILE *
array 作为函数的参数,并返回成功打开的文件数,以用作调用函数中的索引。 (您也可以在尝试读取之前简单地检查流)
例如,如果您在FILE *fparray[MAXF] = {NULL};
中声明了文件指针数组main
,则可以将其作为要在函数中填充的参数传递。 e.g。
nfiles = openmulti (fparray, 0, MAXF);
然后,您的函数将获取数组,就像任何其他类型的数组一样,并使用打开的和已验证的 FILE *
元素填充元素:
int openmulti (FILE **fp, size_t k, size_t n)
{
char fname[MAXFN] = "";
size_t i, idx = 0;
for (i = k; i < n; i++) {
sprintf (fname, "file%zu.txt", i);
fp[idx] = fopen (fname, "r");
if (!fp[idx])
continue;
idx++;
}
return (int)idx;
}
(起始号file#.txt
作为k
传递,然后要打开的文件数传递为n
)
在函数中打开file0.txt
和file1.txt
的简短示例可以是:
#include <stdio.h>
enum { MAXF = 2, MAXFN = 256 };
int openmulti (FILE **fp, size_t k, size_t n);
int main (void) {
FILE *fparray[MAXF] = {NULL};
size_t i, nfiles;
nfiles = openmulti (fparray, 0, MAXF); /* populate array */
if (nfiles < MAXF) /* validate number of open files */
fprintf (stderr, "warning: '%zu' of %d files open.\n",
nfiles, MAXF);
for (i = 0; i < nfiles; i++) { /* read/output file contents */
printf ("\ncontents of 'farray[%zu]'\n\n", i);
char buf[MAXFN] = "";
while (fgets (buf, MAXFN, fparray[i]))
printf ("%s", buf);
fclose (fparray[i]); /* close file after reading */
}
return 0;
}
int openmulti (FILE **fp, size_t k, size_t n)
{
char fname[MAXFN] = "";
size_t i, idx = 0;
for (i = k; i < n; i++) {
sprintf (fname, "file%zu.txt", i);
fp[idx] = fopen (fname, "r");
if (!fp[idx])
continue;
idx++;
}
return (int)idx;
}
示例输入文件
$ cat file0.txt
1.
2. hello -- file0.txt
3.
$ cat file1.txt
1.
2. hello -- file1.txt
3.
示例使用/输出
$ ./bin/filemultiopen
contents of 'farray[0]'
1.
2. hello -- file0.txt
3.
contents of 'farray[1]'
1.
2. hello -- file1.txt
3.
除非有一些关键需要返回FILE **
,否则似乎可以更直接地将数组传递给函数并返回成功打开的文件数。无论满足您的需求,这两种方式都是可能的。
如果您有任何其他问题,请与我们联系。