在C中使用fopen和输入文件名

时间:2016-04-14 22:24:22

标签: c string file fopen

在我的代码中的某个时刻,我想读一个我将要创建(和/或编辑)的文件的名称,并且我已经提出了以下内容:

FILE *fp;
char filename[15];
fgets(filename, 15, stdin);
fp = fopen(filename, "a");
fprintf(fp, "some stuff goes here");
fclose(fp);

即使它编译并运行,它也不会创建(或打开,如果我手动创建它)filename指定的文件。
你会建议什么?

4 个答案:

答案 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");