如何解决Seg Fault在fopen / 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,name);
exit(1);
}
}
当我进入WriteFile1()中的第一个fprintf语句时,它就会出现故障。我使用FILE变量做错了什么吗?似乎它应该像以前一样工作。唯一的区别是文件名字符串的malloc,我改为将其作为名称传递并在引号中给出实际值。
谢谢
解决方法
这段代码是错误的:
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;
}
, 您的打开函数应如下所示:
FILE * OpenFile( char *name) {
FILE * file;
if (!(file = fopen(name,S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
return file;
}
在您的版本中,FILE *实际上是函数的局部变量(因为它是一个参数)。在功能中对其进行更改不会在外部环境中进行更改。
当设计返回指针的函数(或其他任何与此相关的函数)时,总是喜欢通过a7ѭ语句返回指针,而不是尝试通过参数列表来返回指针。
, 这个:
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
始终是正确的,因此完全没有意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。