簡體   English   中英

試圖打開文件名可變的文件時,c程序崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM