题
时使用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
。您可能需要运行在它的循环。