странная проблема чтения файлов в c ++: fread () - PullRequest
0 голосов
/ 02 июля 2010

У меня очень странная проблема при чтении двоичного файла.

void metaDataProcess(FILE *f){

    unsigned __int32 obLength;
    unsigned __int32 numProp;
    char* objPath;
    unsigned __int32 rawDataIndex;
    int level;
    fread(&obLength,sizeof(obLength),1,f);
    objPath=new char[obLength];
    cout<<"i am at"<<ftell(f)<<endl;
    fread(&objPath,sizeof( char),obLength,f);
    objPath[obLength]='\0';
    cout<<"i am at"<<ftell(f)<<" the object path is "<<objPath<<endl;
level=getOrCreateNode(objPath);

fread(&rawDataIndex,sizeof(rawDataIndex),1,f);

"objPath" не получил то, что ожидается в этом месте. В редакторе 010 для этого местоположения это '/', но я читаю его как '>'. это довольно странно, так как из распечатанного значения ftell, это правильная позиция, и значение, прочитанное до и после этого, получает ожидаемое значение (obLength = 1; и следующее значение rawDataIndex == 4294967295).

как же я получил '>', когда я исключил '/'. я пробовал fread (& objPath, sizeof (без знака), obLength, f); fread (& objPath, 1, obLength, f); они все «>»; кто-нибудь может мне помочь с этим? спасибо

Ответы [ 3 ]

1 голос
/ 02 июля 2010

Я не вижу ничего плохого в приведенном выше коде, за исключением того, что вы обрабатываете нелегальную позицию памяти, поскольку вы выделяете:

objPath=new char[obLength];

, а затем делаете:

objPath[obLength]='\0';

Вы должны были выделить new char[obLength+1], чтобы зарезервировать достаточно места для '\ 0'.

Другое дело, что вы печатаете результат ftell после чтения файла.Это то, что вы действительно хотите?

1 голос
/ 02 июля 2010
objPath=new char[obLength + 1];
cout<<"i am at"<<ftell(f)<<endl;
fread(objPath,sizeof( char),obLength,f);
objPath[obLength]='\0';
0 голосов
/ 02 июля 2010

Ваш редактор 010 показывает положение в шестнадцатеричном, а не десятичном? Вы программно печатаете его в десятичном формате, чтобы учесть разницу, которую вы видите.

РЕДАКТИРОВАТЬ: Как выглядит ваш файл? < один символ отличается от /, который вы ожидаете? Вы пробовали читать символы по одному и выяснять, какое смещение на самом деле существует в /?

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