-2

我正在做一份作业,我想将 FILE * 作为参数发送到函数中,因为我必须以相同的方式使用一些“风味文本”打开 3 个文件。我让它像这样正常工作:

enum {IN, STAT, REPRINT} FNAMES;
#define FNAME_MAX 256

int main(void)
{
  FILE *in, *stat, *reprint;
  char fnames[3][FNAME_MAX]; // store actual file names input by user
  char format[11];           // format identifier used in scanf for file names


  in = stat = reprint = NULL; // TODO: Check necessity

  buildFormat(format); // this translates FNAME_MAX into the string "%256s[^\n]"

  // TODO: Find out why this cannot be put into a function!
  // open the input file
  while (in == NULL)
  {
    // get input file name
    getFileName(format, fnames[IN]); // simply prompts for a file name/path

    // open the input file for reading
    in = fopen(fnames[IN], "r");

    // make sure it opened
    if (in == NULL)
      printf("%s did not open, please check spelling/path.\n\n", fnames[IN]);
    else
      printf("%s was opened successfully.\n\n", fnames[IN]);
  }
  return 0;
}

这是行不通的:

void openFile(FILE *in, char *format, char *fname, char *openFor)
{
  // TODO: Find out why this cannot be put into a function!
  // open the input file
  while (in == NULL)
  {
    // get input file name
    getFileName(format, fname); // simply prompts for a file name/path

    // open the input file for reading
    in = fopen(fname, openFor); 

    // make sure it opened
    if (in == NULL)
      printf("%s did not open, please check spelling/path.\n\n", fname);
    else
      printf("%s was opened successfully.\n\n", fname);
  }
}

如果我将文件读取操作放在函数中它可以正常工作,但是如果我回到 main 并尝试使用我发送的文件指针它不起作用。

4

2 回答 2

2

你想openFile返回一个FILE *. 摆脱FILE *in您的输入参数。声明FILE *in为局部变量并在完成后返回其值。

您可能还想在fname本地声明,除非您需要在openFile返回后使用它。

于 2012-04-06T22:50:16.200 回答
1

C 函数不会修改它们的参数,所以如果你真的希望函数修改 FILE * 你可以添加一个间接级别,如 openFile(FILE **in... 并用 &in 调用它。丑陋,是的。更常见的做法是正如其他答案所说,返回一个指针......

在确保我的易出错的记忆电路使用正确的词时发现了一句幽默的引语,“计算机科学中的所有问题都可以通过另一个间接层次来解决”——大卫·惠勒

于 2012-04-06T22:56:43.253 回答