使用 fseek
回溯字符 fscanf
操作可靠吗?
例如,如果我只有 fscanf
-ed 10 个字符,但我想回溯这 10 个字符,我可以只使用 fseek(infile, -10, SEEK_CUR)
?
在大多数情况下它都有效,但我似乎对字符 ^M
有疑问。显然 fseek
将它注册为一个字符,但 fscanf
没有注册它,因此在我之前的示例中,一个包含 ^M
的 10 个字符 block 将需要 fseek(infile, -11, SEEK_CUR)
代替。 fseek(infile, -10, SEEK_CUR)
会使它缩短 1 个字符。
为什么会这样?
编辑:我在文本模式下使用 fopen
最佳答案
您看到了“文本”文件和“二进制”文件之间的区别。当文件以文本模式打开时(fopen 第二个参数中没有 'b'),stdio 库可能(实际上,必须)根据操作系统对文本文件的约定来解释文件的内容。例如,在 Windows 中,一行以\r\n 结尾,并且这会被 stdio 转换为单个\n,因为这是 C 约定。写入文本文件时,单个\n 将输出为\r\n。
这使得编写处理文本文件的可移植 C 程序变得更加容易。然而,一些细节变得复杂,fseeking 就是其中之一。因此,C 标准仅在少数情况下在文本文件中定义 fseek:到最开始、到最后、到当前位置,以及到已使用 ftell 检索到的先前位置。换句话说,您无法计算要查找文本文件的位置。或者您可以,但您必须自己处理所有特定于平台的细节。
或者,您可以使用二进制文件并自己进行行结束转换。同样,便携性受到影响。
在您的情况下,如果您只想返回上次执行 fscancf 的位置,最简单的方法是在执行 fscanf 之前使用 ftell。
关于c - 使用 fseek 回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780303/