我正在尝试在终端中使用“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++;
}
}
答案 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
数组的目的,你用它来存储文件的内容,而不是它的名字。)