首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fseek回溯

使用fseek回溯
EN

Stack Overflow用户
提问于 2009-04-23 04:21:26
回答 5查看 11.9K关注 0票数 5

使用fseek回溯character fscanf操作可靠吗?

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

在大多数情况下,它都可以工作,但我似乎对角色^M有问题。显然,fseek将其注册为字符,但fscanf没有注册它,因此在我之前的示例中,包含^M的10个字符的块将需要fseek(infile, -11, SEEK_CUR)fseek(infile, -10, SEEK_CUR)会将其缩短1个字符。

为何会这样呢?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-23 05:33:25

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

这使得编写处理文本文件的可移植C程序变得更容易。然而,一些细节会变得复杂,而fseeking就是其中之一。正因为如此,C标准只在少数情况下在文本文件中定义fseek :到最开始、到最后、到当前位置以及使用ftell检索到的前一个位置。换句话说,你不能计算一个位置来寻找文本文件。或者你可以,但是你必须自己处理所有特定于平台的细节。

或者,您也可以使用二进制文件并自己进行行尾转换。同样,可移植性也会受到影响。

在您的例子中,如果您只想返回到上次执行fscancf的位置,最简单的方法是在fscanf之前使用ftell。

票数 8
EN

Stack Overflow用户

发布于 2009-04-23 04:41:54

这是因为fseek处理字节,而fscanf智能地处理回车符和换行符是两个字节,并将它们作为一个字符进行处理。

票数 2
EN

Stack Overflow用户

发布于 2009-04-23 04:38:14

Fseek不了解文件的内容,只是将文件指针向后移动了10个字符。

根据操作系统的不同,fscanf可能会以不同的方式解释换行符;如果您使用的是DOS,而文件中没有^M,则fscanf甚至可能会插入^M。检查C编译器附带的手册

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/780303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档