如标题所述,我要求用户提供文件名,并使用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)确实与项目的其余部分位于同一目录中,因此不应该是问题。我已经尝试过测试文件是否正确打开(应该是这样)但是在我给出名字之后它就会一直崩溃。
答案 0 :(得分:2)
主要问题是你试图在函数中设置一个由值传递的参数,并期望在外面改变该值。这不起作用。
目前你有:
void openFile(FILE* fp) {
fp = ...
}
int main()
{
FILE* fp;
openFile(fp);
}
但fp
中的main()
作为指针按值传递。这意味着你在openFile
内部设置一个局部变量,而传递的那个没有被修改。
要解决问题,您可以:
FILE*
openFile
void openFile(FILE** fp)
然后openFile(&fp)
请注意fopen
的第二个参数是const char*
而不是char
,"r"
应该使用。
答案 1 :(得分:1)
应该是fp = fopen(str, "r");
,因为fopen()
期望mode
为char *
指向字符串,而不是单个char
。
此外,由于C中的参数按值传递,因此在fp
被调用后,您的openFile()
不会被修改。要使其正常工作,您必须重写它,并通过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()
用于提供缓冲区溢出保护。