2011-01-18 3 views
2

fgetpos(fp,&pos)を使用しているときは、がfpos_tの場合は、posに負の値が設定されています。なぜこれが起こっているのかを説明する人もいますか?なぜ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ファイルのために働いています。 the cplusplus.com description of fpos_tによれば

+3

あなたは – Ass3mbler

答えて

9

fpos_tオブジェクトは、通常、このタイプのオブジェクトへの参照を返すfgetposの呼び出しによって作成されます。 fpos_tの内容は直接読み取られることを意味するのではなく、fsetposの呼び出しでその参照を引数として使用することのみを目的としています。

理論的には、fpos_tの値は、実装が正しく処理する限り、任意の正または負にすることができます。たとえば、fpos_tは、最初のファイルではなく、ファイルのエンドからいくらかオフセットすることができます。この場合、負の値が意味を成します。それはまた、記号ビットを含む各ビットを使用してファイル位置に関する他の情報を符号化する、奇妙なビットパック表現でもあり得る。

+0

右 'fpos_t'をFPOSしている使用している完全なコードを投稿してください'FILE'と同じように*不透明な型*は実装定義のため実際に内部にアクセスしようとすることは決してありません。 +1 – SiegeX

0

最後に、私はエラーを検出しました....

MSDNは、あなたがどこでもファイルに ポインタの位置を変更するためにfseek関数を使用することができます

を言います。 ポインタは、 を超えてファイルの末尾に配置することもできます。 fseekは、 ファイル終了インジケータをクリアし、以前のungetcコール のストリームに対する、 エフェクトを無効にします。

ファイルが データを追加するために開かれると、現在のファイル位置が最後のI/O操作によって決定 ある、 ない次の書き込みが 生じる場合によって。 が追加されたファイルに対してI/O操作がまだ実行されていない場合は、 がファイルの開始位置になります。ファイルの位置は です。 キャリッジリターン改行翻訳 が予期しない 結果を生成するためにfseekを引き起こす可能性があるため、テキストモードで開かれたストリームのために

は、fseek関数は、使用が制限されています。 がストリーム上で動作することが保証唯一のfseek操作はテキストモードで が開かれる:起源のいずれかの値に0相対 オフセットで探し

。ファイルの先頭から を探し、 ftellへの呼び出しから返されたオフセット値 を返します。

fopenのコールが、それがうまく働いた「RB」に「R」から変更されると....

おかげ

関連する問題