使用echo并使用该文件读取文件名

时间:2013-09-22 03:15:55

标签: c

我正在尝试在终端中使用“echo FileName.txt | a.c”并将文件中的数据读入我在头文件中的数组,但到目前为止我所拥有的代码只是给了我一个无限循环。我尝试将信息存储在本地数组中,但结果仍然相同。

main(int argc, char *argv[]) {
    extern char test[];
    FILE *fp;
    int i = 0;
    int c;       // was char c; originally
    if (argc == 1) {
        fp = stdin;
    } else {
        fp = fopen (argv[1], "r");
    }
    while ((c = getc(fp)) != EOF) {
        test[i] = c;
        printf("%c", test[i]);
        i++;
    }
}

2 个答案:

答案 0 :(得分:2)

(1)将变量c更改为int,以便识别EOF。

(2)不要在printf之前增加i,否则你将打印垃圾。

不确定你想用回声做什么。

答案 1 :(得分:0)

注意:我假设您的程序旨在执行问题中的代码实际执行的操作,即从命令行参数命名的文件读取输入,或者如果没有命令则从stdin读取输入给出了行参数。这是程序运行的一种非常常见的方式,特别是在类Unix系统上。您的问题和调用程序的方式表明您正在做一些完全不同的事情,即从标准输入中读取文件名。这是一件不寻常的事情。如果这确实是您的意图,请更新您的问题以澄清您正在尝试做的事情。

考虑到这个假设,问题不在你的程序中,而在于你如何调用它。这样:

echo FileName.txt | a.c

将字符串FileName.txt作为输入提供给您的程序;该程序不知道(并且应该不知道)它是一个文件名。

将文件名传递给程序的方法是:

a.c FileName.txt

或者,如果您想从stdin

中读取文件的内容
a.c < FileName.txt

(在后一种情况下,shell将负责为您打开文件。)

可以stdin读取文件名,但这很难做到。

其他几点(一些已在评论中指出):

可执行文件的名称可能不应以.c结尾; .c后缀表示C源文件。

您应该使用显式返回类型声明main;从C99开始,删除了“隐式int”规则,无论如何它从来都不是一个特别好的主意:

main(int argc, char *argv[]) { /* ... */ }

您正在将输入文件的全部内容读入test数组。这很少是必要的;特别是,如果您只是将输入文件复制到stdout,则一次不需要存储多个字符。如果确实需要将文件的内容存储在数组中,则需要担心不会溢出数组。如果i超出数组大小,您可能希望使用错误消息中止该程序。

另见Jonathan Leffler评论中的其他建议;这是一个很好的建议(除了我认为他误解了你的test数组的目的,你用它来存储文件的内容,而不是它的名字。)