c程序在尝试打开具有可变文件名的文件时崩溃

时间:2016-04-16 13:24:17

标签: c

如标题所述,我要求用户提供文件名,并使用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)确实与项目的其余部分位于同一目录中,因此不应该是问题。我已经尝试过测试文件是否正确打开(应该是这样)但是在我给出名字之后它就会一直崩溃。

2 个答案:

答案 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()期望modechar *指向字符串,而不是单个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()用于提供缓冲区溢出保护。