我试图对如何在C中使用fputc有一个基本的了解。我已经阅读了一些文档,并认为我做对了。但每次我尝试使用我写的脚本时,执行 ./ fputc> test.txt 其中 text.txt 是一个包含一行文字的文本文件。
这是我的剧本:
int
main(int argc, char **argv){
int ch;
FILE *input;
input = fopen("text.txt", "w+");
while ((ch = getchar()) != EOF){
fputc(ch, input);
}
fclose(input);
return 0;
}
我在编译时没有错误,并且由于某种原因,脚本在文本文件的末尾没有达到EOF。当getchar到达文本文件的末尾时,它不应该返回EOF吗? 尽管文本(text.txt)文件已创建,但它似乎未被编辑。所以在我的while循环中的某个地方出了问题。
我是C编程新手(如果你不知道的话),这个小脚本让我迷惑不解。
任何帮助将不胜感激,或任何具有更多细节的网站的链接也将是伟大的。
干杯,
S上。
答案 0 :(得分:2)
你实质上说的是:
控制台:运行 my_program 并将其输出的任何内容写入te s t.txt。
程序:打开te x t.txt并将stdin的任何输入写入该文件。
您的控制台通常有三个标准流stdin
, stdout
and stderr
。这些流你可以redirect。如果您在Windows上,请查看redirection。
当您说./my_prog > test.txt
时,您告诉控制台(不是my_prog
)的内容是向my_prog
写stdout
次写入test.txt
的文件printf("Hello");
}。
如果您在代码中说test.txt
,那么 Hello 将被写入文件./my_prog < test.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;
}
改变了方向,那将是; 将文件test.txt传输到my_prog 。反过来,如果 test.txt 中有任何文本,则会生成test.txt到text.txt的副本。
现在在你的代码中你说:
my_prog
所以,运行它的方式是:
在您的代码中:
在控制台中:
stdin
重定向到test.txt。你说:
脚本未达到EOF
好吧,因为它从./my_prog < foo.txt
读取,它只会(不是例外)在两种条件下获得EOF。
如果您将文件重定向到您的程序。即<
(注意>
,而非my_prog
)
- 然后会发生foo.txt
将从文件stdin
读取数据,当该文件结束时,您的程序将收到EOF。并因此退出。
如果您手动将EOF输入fputc()
- 在Linux和OSX上 Ctrl - D ,在Windows Ctrl - Z
现在,如果通过键入文本到控制台进行测试,请记住缓存了fflush()
等写操作。这意味着数据不会立即写入文件,但只有当给定数量的数据在缓冲区中时,才会调用text.txt
,关闭流,关闭缓冲等等。
也;如果你运行你的程序。输入文字,输入更多文字,然后点击 Ctrl-C 中止程序,你很有可能在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;
}
没问题。
if (fputc(ch, fh) != ch) { err ...
大多数功能都有办法检查操作是否成功。即:
{{1}}
这将使您的代码更安全,并提供有关失败位置的提示等。
一些链接:
答案 1 :(得分:0)
getchar返回标准输入(stdin)中的下一个字符。 它等同于以stdin作为参数的getc。
因此,您的代码从标准输入而不是FILE *输入读取。
在这里使用fgetc。 fgetc返回指定流的内部文件位置指示符当前指向的字符。然后,内部文件位置指示器前进一个字符以指向下一个字符。
所以,使用fgetc从文件中读取:
while ((ch = fgetc(input)) != EOF)
答案 2 :(得分:0)
你的程序和shell都在写同一个文件。您应该从命令行中删除输出重定向> test.txt