0

我正在尝试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++;
    }
}
4

2 回答 2

2

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

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

不知道你想用回声来完成什么。

于 2013-09-22T03:41:38.387 回答
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数组的目的,你用它来存储文件的内容,而不是它的名字)。

于 2013-09-22T21:17:36.233 回答