[英]Using fopen with input filenames in C
在我的代碼中的某個時候,我想讀取我將創建(和/或編輯)的文件的名稱,並且我想出了以下內容:
FILE *fp;
char filename[15];
fgets(filename, 15, stdin);
fp = fopen(filename, "a");
fprintf(fp, "some stuff goes here");
fclose(fp);
即使它確實編譯並運行,它也不會創建(或打開,如果我手動創建它)由filename
指定的filename
。
你有什么建議?
fgets()
存儲在讀取一行stdin
后從stdin
讀取的換行符。 您需要手動剝離它,例如
size_t len = strlen(filename);
if (len > 0 && filename[len - 1] == '\n')
filename[len - 1] = '\0';
您還應該檢查fopen()
是否不返回NULL
,如果無法打開文件,它將這樣做。 我認為將fprintf
與NULL
文件指針一起使用是未定義的行為。
通常(但不總是), fgets()
會給你一個額外的'\\n'
附加輸入的字符串,因為
換行符使 fgets 停止讀取,但它被函數視為有效字符並包含在復制到 str 的字符串中。
參考: http : //www.cplusplus.com/reference/cstdio/fgets/
要使用最少的代碼擺脫那個'\\n'
:
fgets(filename, 15, stdin);
filename[strcspn(filename, "\n")] = '\0';
您需要聲明filename[16]
才能使用 15 個字符,您需要空格作為終止零。
由於 fgets 將讀取字符串 util 一個 EOF 或換行符,並且如果讀取了換行符,則將其存儲到緩沖區中。 這意味着您必須手動修剪結尾的換行符(如果有)。 我建議改用 fscanf,它不會將換行符添加到緩沖區:
char filename[15];
int ret = fscanf(stdin, "%s", filename);
if (ret != 1) { // handle input error }
fp = fopen(filename, "a");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.