使用fseek回溯

Yew*_*ong 5 c file-io fseek

使用fseek原路返回字符fscanf操作可靠吗?

例如,如果我只有fscanf10个字符,但我想回溯10个字符,我可以fseek(infile, -10, SEEK_CUR)吗?

它适用于大多数情况,但我似乎对角色有问题^M.显然fseek将它注册为char但fscanf不注册它,因此在我之前的示例中,包含a的10个char块^M将需要fseek(infile, -11, SEEK_CUR).fseek(infile, -10, SEEK_CUR)会使它缩短1个字符.

为什么会这样?

编辑:我fopen在文本模式下使用

小智 8

您正在看到"文本"和"二进制"文件之间的区别.当以文本模式打开文件时(fopen第二个参数中没有'b'),stdio库可能(实际上必须)根据操作系统对文本文件的约定来解释文件的内容.例如,在Windows中,一行以\ r \n结尾,并且由stdio将其转换为单个\n,因为这是C约定.写入文本文件时,单个\n输出为\ r \n.

这使得编写处理文本文件的可移植C程序变得更加容易.然而,一些细节变得复杂,而fseeking就是其中之一.因此,在一些情况下,C标准仅在文本文件中定义fseek:从最开始,到最后,到当前位置,以及用ftell检索的先前位置.换句话说,您无法计算要搜索文本文件的位置.或者你可以,但你必须自己处理所有平台特定的细节.

或者,您可以使用二进制文件并自行执行行结束转换.同样,可移植性受到影响.

在你的情况下,如果你只想回到你最后做fscancf的地方,最简单的就是在fscanf之前使用ftell.