了解fputc

时间:2012-04-01 08:42:11

标签: 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){
        fputc(ch, input);
    }
    fclose(input);

    return 0;
}

我在编译时没有错误,并且由于某种原因,脚本在文本文件的末尾没有达到EOF。当getchar到达文本文件的末尾时,它不应该返回EOF吗? 尽管文本(text.txt)文件已创建,但它似乎未被编辑。所以在我的while循环中的某个地方出了问题。

我是C编程新手(如果你不知道的话),这个小脚本让我迷惑不解。

任何帮助将不胜感激,或任何具有更多细节的网站的链接也将是伟大的。

干杯,

S上。

3 个答案:

答案 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_progstdout次写入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

所以,运行它的方式是:

在您的代码中:

  1. 打开text.txt
  2. 等待输入(输入到stdin的数据) - 通常是用户输入文本到控制台,当按下 Enter 时传递给程序。
  3. 在控制台中:

    1. 将任何内容从stdin重定向到test.txt。

    2. 你说:

        

      脚本未达到EOF

      好吧,因为它从./my_prog < foo.txt读取,它只会(不是例外)在两种条件下获得EOF。

      1. 如果您将文件重定向到您的程序。即<(注意>,而非my_prog) - 然后会发生foo.txt将从文件stdin读取数据,当该文件结束时,您的程序将收到EOF。并因此退出。

      2. 如果您手动将EOF输入fputc() - 在Linux和OSX上 Ctrl - D ,在Windows Ctrl - Z


      3. 现在,如果通过键入文本到控制台进行测试,请记住缓存了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