簡體   English   中英

在 C 中將 fopen 與輸入文件名一起使用

[英]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 ,如果無法打開文件,它將這樣做。 我認為將fprintfNULL文件指針一起使用是未定義的行為。

通常(但不總是), 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.

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