当使用gets来获取C中的文件名时,文件会打开,但是当使用fgets时它不会
我在C中尝试从用户输入中获取字符串,以便程序可以打开所选文件。
我尝试使用fgets,因为我在很multithreading上读到它是更安全的选项(而不是获取)。
但是,当使用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);
任何人都可以帮我理解这个吗? 提前致谢。
您需要删除尾随换行符:
char csvFile[256], *p; fgets(csvFile, sizeof csvFile, stdin); if ((p = strchr(csvFile, '\n')) != NULL) { *p = '\0'; /* remove newline */ }
您可以通过在句子的第一个和结尾分别添加两个“=”来检查csvFile
末尾的换行符。
printf("\n=File is %s=\n",csvFile);
您可以使用
库中的strtok()
函数轻松删除csvFile
末尾的换行符。 因此,您可能需要在以下列方式使用fgets()
读取输入字符串后添加一行代码:
fgets(csvFile, sizeof csvFile, stdin); strtok(csvFile, "\n");
您在fgets
和gets
之间观察到的差异是fgets
将换行符留在读取字符串的末尾。 但它不应该让你回到gets
– 只要删除csvFile
中的最后一个字符,如果它是换行符。