提问人:joudia 提问时间:12/11/2021 最后编辑:Andreas Wenzeljoudia 更新时间:12/14/2021 访问量:259
fputc() 之后的 C fgetc() 中的文件处理问题
a problem with file handling in c fgetc() after fputc()
问:
我有一个文件名为的文本文件,其中包含以下内容: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
答:
2赞
Andreas Wenzel
12/11/2021
#1
在更新模式下打开文件时,打开文件进行读取和写入。"r+"
但是,这并不意味着您可以在阅读和写作之间自由切换。根据 ISO C11 标准的 §7.21.5.3 ¶7,存在某些限制:
- 如果不对文件定位函数 (, 或 ) 进行干预调用,则不能在输出后跟输入。
fflush
fseek
fsetpos
rewind
- 如果不对文件定位函数进行干预调用,则输入后不能跟着输出,除非输入操作遇到文件末尾。
在您发布的代码中,您违反了第一条规则,其后果是您的程序调用了未定义的行为。这意味着任何事情都可能发生,包括您的 I/O 函数正在读取或写入废话的可能性(这似乎正在您的案例中发生)。
问题最简单的解决方案可能是在调用 和 之间添加一个调用。fflush
fputc
fgetc
评论
0赞
Barmar
12/14/2021
你有你的倒退。X cannot be followed by Y
0赞
Andreas Wenzel
12/14/2021
@Barmar:你说得对。谢谢你指出来。我相信我现在已经修复了它。
评论
.cpp
rbuf