我在此程序中得到了意外的输出

时间:2019-07-16 18:02:32

标签: c

我只想替换文件中的特定字符。 例如,我想用字符“ p”替换字符“ l”。 这是正确的方法吗?

int main() {
  FILE * ptr;
  ptr = fopen("D:\f4.txt", "r+");

  if (ptr == NULL) {
    printf("file cant be opened");
    exit(0);
  }

  char ch = fgetc(ptr);
  while (ch != EOF) {
    if (ch == 'l') {
      fseek(ptr, -1, 1);
      fputc('p', ptr);
    }

    ch = fgetc(ptr);
  }

  fclose(ptr);
}

假设我文件中的内容是“大家好”,因此输出应类似于“ heppo every”,但它会连续写入文件“ hepepepepepepepepepepepepepepepepep”中。请帮助我找出原因。

1 个答案:

答案 0 :(得分:1)

请注意fopen()的{​​{3}}中的内容。

  

指定“ r +” “ w +” “ a +” 访问类型后,将同时启用读写功能(据说该文件已打开以进行“更新”)。但是,当您从读取切换为写入时,输入操作必须遇到EOF标记。如果没有EOF,则必须对文件定位功能进行中间调用。文件定位功能是fsetposfseekrewind从书写方式切换为阅读方式时,您必须使用居中调用fflush或文件定位功能。(斜体)

因此,在将'p'写入文件后,就好像什么都没发生一样进行读取是不够的,您必须fseek到由ftell获得的原始位置,或fflush文件。

也不要使用幻数:在fseek中,您应该使用SEEK_CUR而不是1

最后,函数fgetc返回的是int类型,而不是char。这样可以将EOF与数据字节0xFF加以区分。