当使用gets来获取C中的文件名时,文件会打开,但是当使用fgets时它不会

时间:2014-08-14 15:11:25

标签: c file fopen

我在C中尝试从用户输入中获取字符串,以便程序可以打开所选文件。 我尝试使用fgets因为我在很多线程上读到它是更安全的选择(而不是获取)。
但是当使用gets存储字符串时,文件会打开,但是fgets不会。

以下是我正在使用的代码:

char csvFile[256];
FILE *inpfile;

printf("Please enter CSV filename: ");
fgets(csvFile,256,stdin);

printf("\nFile is %s\n",csvFile);

inpfile = fopen(csvFile,"r");

if(inpfile == NULL)
{
    printf("File cannot be opened!");
}

我知道文件存在,但是fgets输入了if块 唯一的区别是使用:

gets(csvFile);

取代

fgets(csvFile,256,stdin);

任何人都可以帮我理解这个吗? 提前谢谢。

3 个答案:

答案 0 :(得分:4)

您需要删除尾随换行符:

char csvFile[256], *p;

fgets(csvFile, sizeof csvFile, stdin);
if ((p = strchr(csvFile, '\n')) != NULL) { 
    *p = '\0'; /* remove newline */
}

答案 1 :(得分:1)

您可以分别在句子的第一行和结尾添加两个“=”来检查csvFile末尾的换行符。

printf("\n=File is %s=\n",csvFile);

您可以使用csvFile库中的strtok()功能轻松删除<string.h>末尾的换行符。因此,您可能需要在以下列方式使用fgets()读取输入字符串后添加一行代码:

fgets(csvFile, sizeof csvFile, stdin);
strtok(csvFile, "\n");

答案 2 :(得分:0)

您在fgetsgets之间观察到的差异是fgets将换行符留在读取字符串的末尾。但它不应该让您返回gets - 如果它是换行符,只需删除csvFile中的最后一个字符。