在我的代码中的某个时刻,我想读一个我将要创建(和/或编辑)的文件的名称,并且我已经提出了以下内容:
FILE *fp;
char filename[15];
fgets(filename, 15, stdin);
fp = fopen(filename, "a");
fprintf(fp, "some stuff goes here");
fclose(fp);
即使它编译并运行,它也不会创建(或打开,如果我手动创建它)filename
指定的文件。
你会建议什么?
答案 0 :(得分:6)
fgets()
在读取输入行后存储从size_t len = strlen(filename);
if (len > 0 && filename[len - 1] == '\n')
filename[len - 1] = '\0';
读取的换行符。您需要手动剥离它,例如
fopen()
您还应检查NULL
是否未返回fprintf
,如果无法打开该文件,它将会执行此操作。我认为使用带有NULL
文件指针的{{1}}是未定义的行为。
答案 1 :(得分:0)
你需要声明filename[16]
能够使用15个字符,你需要空间来终止零。
答案 2 :(得分:0)
通常(但并非总是如此),fgets()
会为您提供额外的'\n'
追加输入的字符串,因为
换行符使fgets停止读取,但它被认为是a 函数的有效字符并包含在复制到的字符串中 海峡
参考:http://www.cplusplus.com/reference/cstdio/fgets/
使用最少的代码摆脱'\n'
:
fgets(filename, 15, stdin);
filename[strcspn(filename, "\n")] = '\0';
答案 3 :(得分:0)
由于fgets将读取字符串util eOF或换行符,并且如果读取换行符,则将其存储到缓冲区中。这意味着你必须手动修剪结束换行符(如果有的话)。我建议改用fscanf,它不会将新行添加到缓冲区:
char filename[15];
int ret = fscanf(stdin, "%s", filename);
if (ret != 1) { // handle input error }
fp = fopen(filename, "a");