C 为什么fgetpos()返回负偏移量?

C 为什么fgetpos()返回负偏移量?,c,C,当我使用fgetpos(fp,&pos)时,调用将pos设置为负值,其中pos类型为fpos\u t。有人能解释为什么会这样吗 #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 eac

当我使用
fgetpos(fp,&pos)
时,调用将
pos
设置为负值,其中
pos
类型为
fpos\u t
。有人能解释为什么会这样吗

#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;
}
#包括
#包括
#包括
#定义真1
#定义FALSE 0
#定义最大标签长度50
字符文件名[1000]=“d:\\ire\\a.xml”;
//从xml文件中提取每个标记
int getTag(char*tag,FILE*fp)
{
//跳到下一个开始
而(!feof(fp))
if((char)fgetc(fp)='';//搜索结束标记括号
len=ptr-温度+1;
sprintf(标签,根据:

fpos\u t
对象通常是通过调用
fgetpos
创建的,该调用返回对该类型对象的引用。
fpos\u t
的内容不是直接读取的,而是在调用
fsetpos
时将其引用用作参数


我认为这意味着在理论上,只要实现正确处理,
fpos\u t
的值可以是任意的正或负。例如,
fpos\u t
可以是文件末尾的偏移量,而不是文件开头的偏移量,在这种情况下,负值是有意义的。它也可能是一些奇怪的位-压缩表示,将使用每个位(包括符号位)对有关文件位置的其他信息进行编码。

最后我发现了错误

msdn说

您可以使用fseek重新定位 指针位于文件中的任意位置 指针也可以定位在 fseek文件的结尾将清除 文件结束指示符,并使 任何先前ungetc调用的影响 逆流而上

打开文件进行追加时 数据,当前文件位置为 由最后一次I/O操作确定, 不是在下一次写的地方 发生。如果尚未执行任何I/O操作 在为打开的文件上发生 追加时,文件位置为 文件的开头

对于以文本模式打开的流,fseek的使用有限,因为 回车符–换行符转换 可能导致fseek产生意外的 结果。唯一的fseek操作 保证在打开的流上工作 在文本模式下,有:

以0相对偏移量进行搜索 到任何原始值。正在查找 从具有 从对的调用返回的偏移量值 弗特尔

一旦fopen调用从“r”修改为“rb”,它就可以正常工作了


谢谢

请将您使用的完整代码发布到fposRight
fpos\u t
是一种不透明类型,就像
文件
一样,您永远不应该尝试访问其内部,因为它们是实现定义的。+1
<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>