【问题标题】:How do I ask the user for a filename to use as the input file?如何要求用户输入文件名以用作输入文件?
【发布时间】:2013-12-03 17:21:38
【问题描述】:

这是我的第一篇文章,所以我希望我做的一切都是正确的。 我已经搜索了谷歌和这个网站,但我找不到我想要的答案。

我正在尝试提示用户输入文件名并将此文件名输入 fopen。 当我尝试运行并输入现有文本文件(扩展名为 .txt)时,我仍然遇到 filenotfound 错误消息。

这是我目前的代码(只是想立即打开文件):

#include <stdio.h>
main(){
int c;
FILE *file;
char filename[99];
fgets(filename, 99, stdin);

file = fopen(filename, "r");

if (file) {
    while ((c = getc(file)) != EOF)
        putchar(c);
    fclose(file);
} else{
puts("FILE NOT FOUND");
}
return 0;
}

我猜这与我将它放入一个字符数组有关吗?有什么方法可以用它们制作一个字符串还是别的什么?

【问题讨论】:

  • “我猜这与我将其放入字符数组有关?” -- C 不是我的强项,但我很确定字符数组 is 是 C 中的一个字符串。
  • @Brian S 请注意:在 C 中,“字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。”没有\0,字符数组就不是字符串。
  • 一个迂腐的解决方案会扫描字符串,可能会跳过前导空格,寻找合法的文件名字符,然后验证字符串的其余部分是否为空格。但是,如何接受只包含空格的奇怪文件名呢?谁知道 - 或关心?

标签: c file file-io input


【解决方案1】:

fgets() 保留换行符( \n )。您需要将其删除。一种方法是改变:

fgets(filename, 99, stdin);

到

fgets(filename, 99, stdin);
char *p = strchr(filename, '\n'); // p will point to the newline in filename
if(p) *p = 0; // if p is not null, terminate filename at p

【讨论】:

  • 好的,你在我删除评论时交叉发布了(我说的是 fgets 可能会读取 \r)。
  • @Étienne 我注意到 Windows 不时使用 stdin 很麻烦,因为它似乎以二进制模式打开,在“输入键”上显示 \r\n。为了解决这个问题,我尝试freopen(NULL, "rt", stdin); 强制它进入文本模式并将\r\n 折叠成\n。但无法评价此修复的质量。
  • 谢谢。我能够弄清楚,但您的代码似乎更健壮/高效。谢谢!
猜你喜欢
  • 2019-04-19
  • 1970-01-01
  • 2022-01-20
  • 2022-01-05
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多