[英]c program crashes while trying to open a file with variable filename
如标题中所述,我要求用户提供文件名,然后使用gets
将其保存在str
。 然后,我尝试使用该名称访问文件,并且程序崩溃。
int openFile(FILE *fp){
puts("What's the name of the file (and format) to be accessed?");
char str[64];
gets(str);
fp = fopen((const char *)str, 'r');
...
return 0;
在主要方面:
FILE *fp; // file pointer
openFile(fp);
我输入的文件名(data.txt)确实与项目的其余部分位于同一目录中,所以这不应该是问题。 我试过测试文件是否正确打开(应该打开),但是在输入名称后,它一直崩溃。
主要问题是您试图在函数中设置一个由值传递的参数,并期望该值在外部被更改。 这行不通。
目前您有:
void openFile(FILE* fp) {
fp = ...
}
int main()
{
FILE* fp;
openFile(fp);
}
但是main()
fp
作为值的指针传递。 这意味着在openFile
内部,您正在设置一个局部变量,而传递的变量未修改。
要解决该问题,您可以:
openFile
返回FILE*
void openFile(FILE** fp)
,然后再设置openFile(&fp)
注意fopen
的第二个参数是const char*
而不是单个char
,应使用"r"
。
应该是fp = fopen(str, "r");
,因为fopen()
希望mode
为指向字符串的char *
而不是单个char
。
另外,由于C中的参数是通过value传递的 ,因此调用openFile()
后,您的fp
将不会被修改。 要使其正常工作,您必须重写它,然后通过openFile(&fp);
对其进行调用openFile(&fp);
。 这是一个例子:
void openFile(FILE **fp) {
puts("What's the name of the file (and format) to be accessed?");
char str[64];
fgets(str, 64, stdin);
str[strcspn(str, "\n")] = '\0';
*fp = fopen(str, "r");
}
fgets()
用于提供缓冲区溢出保护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.