问题:我尝试使用
fopen
模式"r+"
读取文件中的某个字符串,并将其修改后写回到原文件,但是没有起作用。回答:在写入之前一定要调用
fseek
,这样可以回到您要覆盖的字符串的开头,并且因为在读/写“+”模式下读取和写入之间始终需要fseek
或fflush
。我的问题是为什么在读/写“+”模式下读取和写入之间始终需要
fseek
或fflush
? Andrew Koenig的C陷阱与缺陷(1989)第5.2节提到这是由于向后兼容性问题。有人能详细解释吗?
问题:我尝试使用
fopen
模式"r+"
读取文件中的某个字符串,并将其修改后写回到原文件,但是没有起作用。回答:在写入之前一定要调用
fseek
,这样可以回到您要覆盖的字符串的开头,并且因为在读/写“+”模式下读取和写入之间始终需要fseek
或fflush
。我的问题是为什么在读/写“+”模式下读取和写入之间始终需要
fseek
或fflush
? Andrew Koenig的C陷阱与缺陷(1989)第5.2节提到这是由于向后兼容性问题。有人能详细解释吗?
该库缓存输入和输出操作。请查看setvbuf()
函数及其参数_IOFBF
、_IOLBF
。
fseek()
或fflush()
要求库提交缓冲操作。
标准规定在改变I/O方向之前需要进行搜索或清除(清除缓存)操作,以便让库更快完成操作。如果没有此限制,库必须针对每个I/O操作检查之前的操作是否为相同方向(读/写),并在I/O方向更改时自行触发刷新。 有了这个限制,库可以假设客户端在改变I/O方向之前已经执行了搜索/清除,并且可以省略方向检查。
因为这使得操作系统/库代码更简单。文件流可能有单独的读取和写入缓冲区,需要额外的努力来确保它们始终同步。这会在不必要的时候降低性能。
因此,程序员需要在需要时明确地执行此操作。
fopen
当使用 update 模式(模式参数值列表中的第二或第三个字符为“+”)打开文件时,可以在相关流上执行输入和输出。但是,在不经过 fflush
函数或文件定位函数 (fseek
、fsetpos
或 rewind
) 的情况下,输出不能直接跟随输入,而且在没有经过文件定位函数的情况下,输入不能直接跟随输出,除非输入操作遇到文件结束。在某些实现中,用 update 模式打开(或创建)一个文本文件可能会打开(或创建)一个二进制流。fseek(pFile,0,SEEK_CUR)
来确保缓冲区因为fseek()
设置文件指针位置而被刷新?我曾经提出过这个问题,但没有得到答案!! - Thokchom