2011-06-13 84 views
1

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

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

它,只要我得到第一个fprintf中声明WriteFile1()赛格故障。我用FILE变量做错了什么吗?它似乎应该像以前一样工作。唯一的区别是文件名字符串的malloc,我将其作为名称传入,并将实际值用引号引起来。

谢谢

+2

我看不出你原来的代码可能如何工作,因为你从来没有真正设置文件名你malloc。 – 2011-06-13 15:19:45

+0

如果WriteFile1()中有fprintf语句,请您向我们展示代码? – razlebe 2011-06-13 15:22:05

+0

如果fopen失败,你*必须*包含系统错误(例如,来自perror()或strerror())以产生有用的错误消息。 “无法打开文件。正在退出...”不是有用的错误消息。 – 2011-06-14 04:06:47

回答

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; 
} 
+0

Doh!谢谢 - 它总是很明显的事情。 – Alex 2011-06-13 15:28:52

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语句返回指针,而不是通过参数列表尝试执行。

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总是如此,所以根本没有必要参与。