了解fputc
我试图对如何在C语言中使用fputc有一个基本的了解。我已经阅读了一些文档,相信我是对的。但是每次我尝试使用我通过执行/fputc>test.txt编写的脚本时,text.txt是一个包含一行文本的文本文件 这是我的剧本:了解fputc,c,fopen,getchar,C,Fopen,Getchar,我试图对如何在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){
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编程新手(如果你不知道的话),这个小脚本让我困惑不解
任何帮助将不胜感激,或任何与进一步的细节网站链接也将是伟大的
干杯
getchar返回标准输入(stdin)中的下一个字符。 它等价于以stdin作为参数的getc 因此,您的代码从标准输入读取,而不是从文件*输入读取 在这里使用fgetc。 fgetc返回指定流的内部文件位置指示器当前指向的字符。然后,内部文件位置指示器前进一个字符以指向下一个字符 因此,使用fgetc读取文件:
while ((ch = fgetc(input)) != EOF)
您的程序和shell都在编写同一个文件。您应该从命令行中删除输出重定向test.txt您实际上说的是:
- 控制台:运行my_程序并将其输出的任何内容写入test.txt
- 程序:打开text.txt并将stdin的任何输入写入该文件
您的控制台通常有三个标准流。这些溪流你可以。如果您在Windows上,请同时查看,即 当你说
/my_prog>test.txt
时,你告诉你的控制台(不是my_prog
),你要写的是my_prog
写到stdout
文件中的任何东西
如果您在代码中说,即printf(“你好”)
,那么Hello将被写入文件test.txt
如果你改为说/my_prog
来改变你的重定向,你会是;将文件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;
}
因此,您运行它的方式是:
在代码中:
my_prog
中的任何内容重定向到test.txt你说: 脚本未达到EOF 好的,当它从stdin读取时,它只会(并非毫无例外)在两种情况下获得EOF
/my_prog
(注意
)。-然后会发生的情况是
my_prog
将从文件foo.txt
读取数据,当该文件结束时,您的程序将收到EOF。因此,退出stdin
-在Linux和OSX上Ctrl-D,在Windows上Ctrl-Z
现在,如果您通过向console键入文本来测试这一点,请记住像
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;
}
大多数函数都有一种检查操作是否成功的方法。即:
if (fputc(ch, fh) != ch) { err ...
这将使你的代码更加安全,给你提示在哪里失败等等
一些链接:
- 查看文章顶部的重定向链接
- 查看中的函数。即。:
/fputc>test.txt
将截断test.txt
。您有两个文件(test.txt和text.txt)吗?您是否尝试使用一个作为输入?(确实不清楚。)此代码无法检查fopen
调用的结果以确定调用是否成功,尽管这不是当前问题的原因。它还应该检查fclose
的结果。