我有一个创建多个文件的程序。每个正在创建的文件都有一个功能。在每个函数中,完全相同的代码是创建文件名,打开/创建文件以进行写入,设置其权限以及最后关闭文件。我决定创建一个打开文件和关闭文件的功能,这样我就可以调用它而不是每次都使用相同的代码。以前的代码在每个函数中都如下所示:
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,我将其作为名称传递,并以引号给出实际值。
谢谢
答案 0 :(得分:2)
这段代码错了:
void OpenFile(FILE *file, char *name) {
if (!(file = fopen(name, "w"))) {
在这里,您只需分配到本地file
变量。
您必须返回file
,因此您的WriteFile1()函数可以使用该文件*
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;
}
答案 1 :(得分:1)
您的开放功能应如下所示:
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
语句返回指针,而不是尝试通过参数列表来执行。
答案 2 :(得分: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
始终是真的,所以根本没有任何意义。