fputc() 之后的 C fgetc() 中的文件处理问题

a problem with file handling in c fgetc() after fputc()

提问人:joudia 提问时间:12/11/2021 最后编辑:Andreas Wenzeljoudia 更新时间:12/14/2021 访问量:259

问:

我有一个文件名为的文本文件,其中包含以下内容:in.txt

1111
1100
0000

我正在尝试使用以下程序更改此文件的内容:

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

int main( void )
{
    FILE *fp = fopen( "in.txt", "r+" );

    fseek( fp, 6, SEEK_CUR );
    fputc( '1', fp );
    printf( "%c", fgetc( fp ) );

    fclose( fp );
}

运行此程序后,文本文件第 2 行的第 3 个字符已更改为字符代码(不是数字的字符代码,它将是 ASCII)。0'0'48

为什么会这样?

由于我写入文件的唯一字符是数字的字符代码,因此文件中的一个字符怎么可能被完全不同的字符覆盖?1

C 文件

评论

1赞 o11c 12/11/2021
请将代码和错误直接放在帖子中,而不是作为链接图像。
1赞 Barmar 12/11/2021
为什么你有 C 程序的扩展?这通常是针对C++的。.cpp
1赞 Barmar 12/11/2021
你从来不用,是干什么用的?rbuf
3赞 Andreas Wenzel 12/11/2021
您可能想阅读以下内容: 为什么不在提问时上传代码/错误的图像?
1赞 Andreas Wenzel 12/11/2021
由于您没有自己解决问题,因此我从图像中输入了代码的必要部分并将它们插入到问题中,并解释了图像中显示的内容。我还重新表述了整个问题。如果您对我的配方不满意,请随时更改。

答:

2赞 Andreas Wenzel 12/11/2021 #1

在更新模式下打开文件时,打开文件进行读取和写入。"r+"

但是,这并不意味着您可以在阅读和写作之间自由切换。根据 ISO C11 标准的 §7.21.5.3 ¶7,存在某些限制:

  • 如果不对文件定位函数 (, 或 ) 进行干预调用,则不能在输出后跟输入。fflushfseekfsetposrewind
  • 如果不对文件定位函数进行干预调用,则输入后不能跟着输出,除非输入操作遇到文件末尾。

在您发布的代码中,您违反了第一条规则,其后果是您的程序调用了未定义的行为。这意味着任何事情都可能发生,包括您的 I/O 函数正在读取或写入废话的可能性(这似乎正在您的案例中发生)。

问题最简单的解决方案可能是在调用 和 之间添加一个调用。fflushfputcfgetc

评论

0赞 Barmar 12/14/2021
你有你的倒退。X cannot be followed by Y
0赞 Andreas Wenzel 12/14/2021
@Barmar:你说得对。谢谢你指出来。我相信我现在已经修复了它。