2011-01-18 121 views
2

当我使用fgetpos(fp,&pos)时,呼叫将pos设置为负值,其中pos的类型为fpos_t。有人可以解释为什么会发生这种情况吗?为什么fgetpos()返回负偏移量?

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 


#define TRUE 1 
#define FALSE 0 

#define MAX_TAG_LEN 50 

char filename[1000] = "d:\\ire\\a.xml"; 

//extract each tag from the xml file 
int getTag(char * tag, FILE *fp) 
{ 
    //skip until a beginning of a next 
    while(!feof(fp)) 
     if((char)fgetc(fp) == '<')break; 

    if(!feof(fp)){ 
     char temp[MAX_TAG_LEN]={0}; 
     char *ptr; 
     int len; 
     fpos_t b; 
     fgetpos(fp,&b); // here the b is containing -ve values.....??? 
     fread(temp,sizeof(char),MAX_TAG_LEN - 1,fp); 
     temp[MAX_TAG_LEN-1] = 0; 
     ptr = strchr(temp,'>'); //search of ending tag bracket 
     len = ptr - temp + 1; 
     sprintf(tag,"<%.*s",len,temp); //copy the tag 
     printf("%s",tag); //print the tag 
     b += len;   //reset the position of file pointer to just after the tag character. 
     fsetpos(fp,&b); 

     return TRUE; 
    } 
    else{ 
     return FALSE; 
    } 
} 



int main() 
{ 
    int ch; 
    char tag[100]={0}; 
    FILE *fp = fopen(filename,"r"); 

    while(getTag(tag,fp)){ 
    } 

    fclose(fp); 

    return 0; 
} 

其中A.XML是一个非常基本的XML文件

<file> 
    <page> 
    <title>AccessibleComputing</title> 
    <id>10</id> 
    <redirect /> 
    <revision> 
     <id>133452289</id> 
     <timestamp>2007-05-25T17:12:12Z</timestamp> 
     <contributor> 
     <username>Gurch</username> 
     <id>241822</id> 
     </contributor> 
     <minor /> 
     <comment>Revert edit(s) by [[Special:Contributions/Ngaiklin|Ngaiklin]] to last version by [[Special:Contributions/Rory096|Rory096]]</comment> 
     <text xml:space="preserve">#REDIRECT [[Computer accessibility]] {{R from CamelCase}}</text> 
    </revision> 
    </page> 

    </file> 

该代码是工作了一段XML文件,但因上述XML文件正在打印的第一个标签后回采。

+3

请张贴的完整代码您使用的是FPOS – Ass3mbler 2011-01-18 21:08:05

回答

9

根据the cplusplus.com description of fpos_t

fpos_t对象通常是通过以fgetpos的呼叫时,它返回到该类型的一个对象的引用创建的。 fpos_t的内容并不是要直接读取,而只是将其参考用作调用fsetpos时的参数。

我认为这意味着理论上fpos_t的值可以是任意正数或负数,只要实现正确处理它。例如,fpos_t可能与文件的结尾有些偏移,而不是开始,在这种情况下,负值是有意义的。它也可能是一些奇怪的比特填充表示,它会使用包括符号位在内的每一位来编码关于文件位置的一些其他信息。

+0

右`fpos_t`是一个* opaque类型就像`FILE`一样,你永远不应该尝试访问它的内部,因为它们是实现定义的。 +1 – SiegeX 2011-01-18 21:22:34

0

终于让我找到了错误....

MSDN说

您可以使用FSEEK随时随地重新定位 指针在文件中。 指针也可以位于文件末尾的 之外。 fseek清除 文件结束指示符,并抵消任何先前未收到的呼叫 针对流的影响 。

当一个文件被打开用于附加 数据,当前文件位置是 由最后的I/O操作而确定, 不会发生 下一个写入位置。如果还没有I/O操作 发生在为 追加打开的文件上,则文件位置为该文件的起始位置 。

以文本方式打开流,FSEEK很少用到,因为 回车换行符翻译 可引起FSEEK产生意想不到的结果 。保证对工作流的唯一FSEEK操作 打开 在文本模式有:

与0相对 任何起源值的偏移追求。从文件的开始处寻找 ,并将 偏移值从调用返回到 ftell。

一次fopen的调用由“R”为“RB”它工作得很好修饰....

感谢

相关问题