你的本质是:
您的控制台通常具有三个标准流stdin, stdout and stderr。这些流你可以redirect。如果您使用的是 Windows,还请查看 redirection。
当您说./my_prog > test.txt 时,您告诉控制台(而不是my_prog)的内容是将my_prog 写入stdout 的任何内容写入文件test.txt。
如果你在你的代码中说 printf("Hello");,那么 Hello 将被写入文件 test.txt。
如果您通过说./my_prog < test.txt 来扭转重定向,则可以; 将文件 test.txt 流式传输到 my_prog。反过来,如果 test.txt 中有任何文本,则会将 test.txt 复制到 text.txt。
现在在你的代码中你说:
int main(void)
{
int ch;
FILE *input;
/* Here you open a handle to the file text.txt for reading and writing */
input = fopen("text.txt", "w+");
while ((ch = getchar()) != EOF) { /* get next char from stdin */
fputc(ch, input); /* write that char to the handle input */
}
fclose(input); /* close the handle */
return 0;
}
那么会发生什么,你运行它的方式是:
在您的代码中:
- 打开 text.txt
- 等待输入(数据输入到标准输入) - 通常是用户在控制台输入文本,在按下 Enter 时传递给程序。
在控制台中:
- 将
my_prog 中的任何内容重定向到 test.txt。
你说:
脚本没有到达 EOF
好吧,当它从stdin 读取时,它只会(并非没有例外)在两种情况下获得 EOF。
如果您将文件重定向到您的程序。 IE。 ./my_prog < foo.txt(注意<,而不是>)。
- 然后会发生my_prog 将从文件foo.txt 中读取数据,并且当该文件结束时,您的程序将收到一个EOF。并且,因此退出。
如果手动输入 EOF 到 stdin。
- 在 Linux 和 OSX 上 Ctrl-D,在 Windows 上 Ctrl-Z
现在,如果您通过向控制台输入文本来测试这一点,请记住像 fputc() 这样的写入操作是缓冲的。这意味着数据不会立即写入文件,而是只有在缓冲区中有给定数量的数据、调用fflush()、关闭流、关闭缓冲等时才写入文件。
还有;如果你运行你的程序。输入文本,再输入一些文本,然后按 Ctrl-C 中止程序,这很有可能在 text.txt 中没有数据结束。
原因是程序被杀死,因此fclose() 从未被调用,因此没有刷新到文件。
在您进一步努力编程时,养成不假设任何事情的习惯将是一个非常好的主意。 IE。不要以为fopen() 可以。
FILE *fh;
char *outfile = "foo.txt";
if ((fh = fopen(outfile, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n --",
outfile);
perror(" fopen() ");
return 1;
}
大多数函数都有检查操作是否成功的方法。即:
if (fputc(ch, fh) != ch) { err ...
这将使你的代码更安全,给你提示它失败的地方等等。
一些链接: