1

我有一个创建多个文件的程序。每个正在创建的文件都有一个函数。每个函数中都有完全相同的代码来创建文件名、打开/创建文件以进行写入、设置其权限并最后关闭文件。我决定创建一个打开文件和关闭文件的函数,这样我就可以调用它而不是每次都使用相同的代码。之前每个函数中的代码如下所示:

void WriteFile1(char *name) {
   FILE *file;
   char *filename; //This is being malloc'ed because it initially consisted of multiple strings

   if (!(filename = malloc(sizeof(char *) * (strlen(name) + 1)))) MallocError();
   if (!(file = fopen(filename, "w"))) {
       fprintf(stderr, "Unable to open %s. Exiting \n", filename);
       exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);

   //a bunch of fprintf statements here

   if (fclose(file)) {
       fprintf(stderr, "Error closing %s. Exiting...\n", filename);
       exit(1);
   }
}

这工作得很好。我没有问题。现在它看起来如下所示:

void WriteFile1() {
FILE *file;

OpenFile(file, "filename.asdf");
//fprintf statements
CloseFile(file, "filename.asdf");
}

void OpenFile(FILE *file, char *name) {
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
}
void CloseFile(FILE *file, char *name) {
    if (fclose(file)) {
        fprintf(stderr, "Error closing %s. Exiting...\n", name);
        exit(1);
    }
}

一旦我到达 WriteFile1() 中的第一个 fprintf 语句,它就会出现故障。我对 FILE 变量做错了什么吗?似乎它应该像以前一样工作。唯一的区别是文件名字符串的 malloc,我将其作为名称传递并在引号中给出实际值。

谢谢

4

3 回答 3

2

这段代码是错误的:

void OpenFile(FILE *file, char *name) {
   if (!(file = fopen(name, "w"))) {

在这里,您只是分配给局部file变量。您必须返回file,因此您的 WriteFile1() 函数可以使用该 FILE*

void WriteFile1() {
FILE *file;

file = OpenFile("filename.asdf");
//fprintf statements
CloseFile(file, "filename.asdf");
}

FILE * OpenFile(char *name) {
   FILE * file;
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
   return file;
}
于 2011-06-13T15:22:04.067 回答
1

您的 open 函数应如下所示:

FILE *  OpenFile( char *name) {
   FILE * file;
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
   return file;
}

在您的版本中, FILE * 实际上是函数的局部变量(因为它是参数)。在函数中改变它并不会在外界改变它。

在设计返回指针(或其他任何东西)的函数时,总是更喜欢通过return语句返回指针,而不是尝试通过参数列表来返回。

于 2011-06-13T15:21:16.670 回答
1

这:

filename = malloc(sizeof(char *) * (strlen(name) + 1))

应该:

filename = strdup(name);

如果你有它,否则类似:

if((filename = malloc(strlen(name) + 1)) != NULL)
{
   strcpy(filename, name);
   ...
}

特别注意每个字符只是一个char,而不是一个char *。因为sizeof (char) == 1它总是正确的,所以根本没有涉及它的意义。

于 2011-06-13T15:23:56.890 回答