时使用fseek回溯字符fscanf操作可靠?

像,例如,如果我刚fscanf-ED 10个字符,但我想原路返回10个字符我可以fseek(infile, -10, SEEK_CUR)

在大多数情况下它的工作原理,但我似乎已经与字符^M问题。显然fseek其登记为一个char但fscanf不注册,从而在我以前的例子含有^M将需要fseek(infile, -11, SEEK_CUR)代替10焦炭块。 fseek(infile, -10, SEEK_CUR)将使由1个字符使其短。

这是为什么呢?

编辑:我用fopen在文本模式

有帮助吗?

解决方案

您所看到的“文本”和“二进制”文件之间的差异。当文件在文本模式(在FOPEN第二个参数没有“B”)被打开,stdio库可能(实际上,必须)根据操作系统的约定文本文件解释文件的内容。例如,在Windows中,符合\ r \ n结束,并且这个被转换到通过标准输入输出单\ N,因为这是C约定。当写入到一个文本文件,一个单一的\ n变输出作为\ r \ n

这使得它更容易编写处理文本文件可移植的C程序。一些细节变得复杂,但是,fseeking就是其中之一。正因为如此,C标准只定义FSEEK在文本文件中的一些情况:在最开始,到最后,到目前位置,并已获取与FTELL以前的位置。换句话说,你不能计算寻求文本文件的位置。或者你可以,但你必须采取的所有特定平台的细节照顾自己。

另外,你可以使用二进制文件,并自己做行结束转换。再次,便携受到影响。

在你的情况,如果你只是想回去的地方,你最后做fscancf,最简单的将是FTELL你FSCANF之前使用。

其他提示

这是因为与FSEEK字节工作,而智能的fscanf处理该回车和换行是两个字节,和燕子它们作为一个字符。

FSEEK没有的该文件的内容的理解,只是移动文件指针10个字符回来。

的fscanf取决于OS的不同,可以不同的方式解译换行符;它甚至可能是这样,如果你在DOS和^ M没有出现在文件中的fscanf将插入^ M。请检查您的C编译器来您的手册

只需使用VS2008尝试这样做,发现的fscanf和FSEEK处理中相同的方式,CR和LF字符(作为单个字符)。

因此,与两个文件:

0000000:3132 3334 3554 3738 3930 3132 3334 3536 12345X7890123456

0000000:3132 3334 350D 3839 0a37 3031 3233 3435 12345..789012345

如果我读15个字符我到第二“5”,然后寻求背部10个字符,我的下一个字符的读取是在第一种情况下的“X”和在第二个CRLF。

这似乎是一个非常OS /编译器特定的问题。

你测试fscanf的返回值?张贴一些代码。

看一看 ungetc 。您可能需要运行在它的循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top