Почему fgetpos () возвращает отрицательное смещение? - PullRequest
2 голосов
/ 19 января 2011

Когда я использую fgetpos(fp,&pos), вызов устанавливает pos в отрицательное значение, где pos имеет тип fpos_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;
}

, где 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файл останавливается после печати первого тега.

Ответы [ 2 ]

9 голосов
/ 19 января 2011

Согласно описанию cplusplus.com fpos_t:

fpos_t объекты обычно создаются путем вызова fgetpos, который возвращает ссылку на объект этого типа. Содержимое fpos_t предназначено не для непосредственного чтения, а только для использования его ссылки в качестве аргумента при вызове fsetpos.

Я думаю, это означает, что в теории значение fpos_t может быть произвольно положительным или отрицательным, если реализация правильно его обрабатывает. Например, fpos_t может быть некоторым смещением от конца файла, а не его начала, и в этом случае отрицательные значения имеют смысл. Это также может быть какое-то странное битовое представление, которое будет использовать каждый бит, включая знаковый бит, для кодирования некоторой другой информации о положении файла.

0 голосов
/ 19 января 2011

Наконец-то я нашел ошибку ....

MSDN говорит

Вы можете использовать fseek, чтобы изменить положение указатель в любом месте файла. указатель также может быть расположен за конец файла. Fseek очищает индикатор конца файла и отрицает эффект любых предыдущих вызовов ungetc против течения.

Когда файл открыт для добавления данные, текущая позиция файла определяется последней операцией ввода / вывода, не там, где следующая запись будет происходят. Если операции ввода / вывода еще нет произошло в файле, открытом для добавление, позиция файла начало файла.

Для потоков, открытых в текстовом режиме, fseek имеет ограниченное использование, потому что возврат каретки - переводы перевода строки может вызвать fseek неожиданно результаты. Единственные операции fseek гарантированно работать на открытых потоках в текстовом режиме:

Поиск со смещением 0 относительно к любому из исходных значений. Ищу с начала файла с значение смещения, возвращаемое из вызова ftell.

как только вызов fopen изменен с "r" на "rb", он работает нормально ...

спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...