【问题标题】:Read input from one file and write it to another file in C从一个文件读取输入并将其写入 C 中的另一个文件
【发布时间】:2015-12-29 16:30:06
【问题描述】:

我正在尝试从文件“file.txt”中读取内容并将其中的每个字符写入“copy.txt”,但在“copy.txt”文件的末尾出现了一个奇怪的字符。

我正在尝试打开和关闭这两个文件,并在程序中修改 while 循环的主体,以便不再将字符放入标准输出(stdout)。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char c;
  FILE *from, *to;

  from = fopen("file.txt", "r");
  if (from == NULL)
  {
    perror("file.txt doesn't exist.");
    exit(1);
  }

  to = fopen("copy.txt", "w");
  if (to == NULL)
    {
      perror("copy.txt doesn't exist.");
      exit(1);
    }
  do
    {
      c = getc(from);
      putc(c, to);
    }
  while(c != EOF);
  fclose(to);
  fclose(from);
  exit(0);
}

【问题讨论】:

  • getc() 返回EOF 之后,您使用EOF 结果调用putc()
  • 另外,c 应该是 int,而不是 char
  • 顺便说一下@JamesR,使用int c 而不是char c 的原因是EOF 不一定可以在char 中表示。
  • 你可以把循环改成while ((c = getc(from)) != EOF) { putc(c, to); }
  • 请一致地缩进代码。建议在每个左大括号 '{' 后缩进 4 个空格,并在每个右大括号 '}' 之前不缩进。不要使用制表符进行缩进,因为每个文字处理器/编辑器都以不同的方式定义制表位/制表符宽度。使用 4 个空格,因为即使使用可变宽度字体也是如此。

标签: c file input while-loop


【解决方案1】:

你的问题在于这个循环:

do
{
  c = getc(from);
  putc(c, to);
}
while(c != EOF);

您需要了解do-whilewhile 循环之间的区别。 while 循环将在运行循环之前计算表达式(因此循环至少运行 0 次),do-while 循环在循环循环之后计算表达式(因此至少运行一次)。

那么问题是什么?您读取一个字符,将其写入copy.txt,然后评估其是否为EOF 并退出循环。现在,当从文件中读取最后一个字符时会发生什么?循环将再运行一次,因为最后一个字符不是EOF。您的程序将再读取一个字符并写入文件。就是你说的那个角色。

所以为了修复,你需要在写作之前评估EOF。这里有两种尝试,一种会保留do-while 循环,另一种会使用while 循环(更清晰):

Do-While Attempt(如果不美观且不必要):

do
{
    c = getc(from);
    if (c != EOF) {            
        putc(c, to);
    }
}
while(c != EOF);

尝试时:

while ((c = getc(from)) != EOF) {
    putc(c, to);
}

【讨论】:

  • 哎呀,这两行与它们需要的相反:if (c != EOF) { c = getc(from);
  • 为什么投反对票?如有不妥请留言!
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 2021-01-23
  • 2017-05-03
  • 2018-06-27
  • 2018-10-30
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多