返回一个文件数组

时间:2016-04-25 00:01:50

标签: c arrays

我正在尝试创建一个返回文件数组的函数,但我找不到在函数外部访问该数组的方法。 这就是我的尝试:

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);

如何访问这种数组?

2 个答案:

答案 0 :(得分:3)

您正在返回指向静态数组的指针。没关系。但是C不会神奇地将数组复制到另一个位置。您可以更改声明:

FILE**psaidas;
psaidas = arquivoescrita(0);

这将有效。但此时,psaidas将指向您的static FILE *数组。因此,如果再次致电arquivoescrita,它将被覆盖。

如果这样做 - 它可能会起作用 - 那就继续吧。如果您在完成文件之前需要多次调用arquivoescrita,那么您必须使用malloccalloc 动态分配您的结果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.txtfile1.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 **,否则似乎可以更直接地将数组传递给函数并返回成功打开的文件数。无论满足您的需求,这两种方式都是可能的。

如果您有任何其他问题,请与我们联系。