了解fputc

了解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){

我试图对如何在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编程新手(如果你不知道的话),这个小脚本让我困惑不解

任何帮助将不胜感激,或任何与进一步的细节网站链接也将是伟大的

干杯


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;
}
因此,您运行它的方式是:

在代码中:

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

  • my_prog
    中的任何内容重定向到test.txt

  • 你说:

    脚本未达到EOF

    好的,当它从stdin读取时,它只会(并非毫无例外)在两种情况下获得EOF

  • 如果您将文件重定向到您的程序。即
    /my_prog
    (注意
    )。
    -然后会发生的情况是
    my_prog
    将从文件
    foo.txt
    读取数据,当该文件结束时,您的程序将收到EOF。因此,退出

  • 如果手动将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
    的结果。