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