你本质上说的是:
您的控制台通常具有三个标准流stdin
,stdout
和stderr
. 您可以重定向这些流。如果您在 Windows 上,还请查看 ie redirection。
当你说./my_prog > test.txt
,你告诉你的控制台,(不是my_prog
),是写任何my_prog
写入stdout
文件test.txt
。
如果你在你的代码中说 ie 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;
}
那么会发生什么,你运行它的方式是:
在您的代码中:
- 打开文本.txt
- 等待输入(输入到标准输入的数据)——通常是用户向控制台输入文本,Enter按下时传递给程序。
在控制台中:
- 将任何内容重定向
my_prog
到 test.txt。
你说:
脚本未达到 EOF
好吧,当它从中读取时stdin
,只会(并非没有例外)在两种情况下获得 EOF。
如果您将文件重定向到您的程序。即./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()
从未被调用,因此没有刷新到文件。
在您进一步努力编程时,养成不假设任何事情的习惯将是一个非常好的主意。即不认为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;
}
大多数函数都有一种方法来检查操作是否成功。IE:
if (fputc(ch, fh) != ch) { err ...
这将使你的代码更安全,给你提示它失败的地方等等。
一些链接: