[英]user input of name using getchar() then diplaying the name. (c code)
[英]C - Using a user input file name
我嘗試從用戶輸入中打開文件時遇到問題。 如果文件名是第一次輸入,我可以打開它,但如果在while循環中它是正確的,則不能打開它。
char file[256], *end;
printf("Enter the name of the file: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
FILE *fp=fopen(file, "r");
while(fp==NULL)
{
printf("The given file doesn't exist. Enter a file name: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
FILE *fp=fopen(file, "r");
}
您需要在此處考慮該平台,以使其跨平台文件的代碼檢查方法是否不同。 如果平台不重要,那么您不必擔心Windows,在Linux中,您可以使用stat utility 。
檢查文件是否存在的簡單方法(以讀取模式檢查):
int read_file_exists(const char *filename)
{
FILE *fp = fopen (filename, "r");
if (fp!=NULL) fclose (fp);
return (fp!=NULL);
}
如果文件名是第一次輸入,我可以打開它,但如果在while循環中它是正確的,則不能打開它。
不,你被騙了。 問題是while(fp==NULL)
中的循環條件測試了在循環外部聲明的變量fp
的值,而在循環內部您從未設置該變量,因此,如果您進入循環,則永遠不會退出。
但這並不意味着您無法在第二次嘗試或隨后的嘗試中打開文件。 在循環內部,聲明另一個變量fp
,將其“陰影化”到外部,然后將fopen()
的結果分配給它。 當此fopen()
成功執行時,您實際上將忽略結果。
回答說,另一個現在已刪除的方法,主要要做的是修復循環,使其使用與外部相同的fp
。 實現的最小更改將產生此版本的循環:
while(fp==NULL)
{
printf("The given file doesn't exist. Enter a file name: ");
fgets(file, 256, stdin);
if((end=strchr(file, '\n'))!=NULL)
*end='\0';
fp=fopen(file, "r");
}
在此處和前面的代碼中輸入文件名的方式還有其他一些問題,以及一些不必要的代碼重復,但是只要用戶輸入的文件名簡單而簡短,就可以做到。特技。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.