0

我试图对如何在 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。

4

3 回答 3

2

你本质上说的是:

  • 控制台:运行my_program并将其输出的任何内容写入 te s t.txt。

  • 程序:打开 te x t.txt 并将标准输入的任何输入写入该文件。


您的控制台通常具有三个标准流stdinstdoutstderr. 您可以重定向这些流。如果您在 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;
}

那么会发生什么,你运行它的方式是:

在您的代码中:

  1. 打开文本.txt
  2. 等待输入(输入到标准输入的数据)——通常是用户向控制台输入文本,Enter按下时传递给程序。

在控制台中:

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

你说:

脚本未达到 EOF

好吧,当它从中读取时stdin,只会(并非没有例外)在两种情况下获得 EOF。

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

  2. 如果手动输入 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 ...

这将使你的代码更安全,给你提示它失败的地方等等。


一些链接:

于 2012-04-01T12:55:30.140 回答
0

getchar 从标准输入 (stdin) 返回下一个字符。它相当于 getc 以 stdin 作为参数。

因此,您的代码从标准输入而不是 FILE* 输入读取。

在这里使用 fgetc。fgetc 返回指定流的内部文件位置指示符当前指向的字符。然后内部文件位置指示器前进一个字符以指向下一个字符。

因此,使用 fgetc 从文件中读取:

while ((ch = fgetc(input)) != EOF)
于 2012-04-01T08:52:49.633 回答
0

您的程序和外壳程序都在编写同一个文件。> test.txt您应该从命令行中删除输出重定向

于 2012-04-01T08:54:32.640 回答