c - 使用 fseek 回溯

标签 c file-io fseek

使用 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/

相关文章:

c - 为什么它不验证c中的字符串

c++ - 固定大小数组与 alloca(或 VLA)

Java:从 InputStream 读取并不总是读取相同数量的数据

c - fread() 返回零字节读取 : I Don't Understand Why

performance - fseek()如何在文件系统中实现?

c - %g 如何对 float 进行四舍五入?

c - 三度树的递归和非递归遍历

Java程序比较两个文本文件,然后将第一个文本文件中找到的变量替换为第二个文件中的变量到第三个文件中

c - 使用 C 中的排序字典对字符串进行拼写检查

c - c语言向文件中插入数据