c ++中奇怪的文件读取问题:fread()

时间:2010-07-02 18:18:33

标签: c++ c file-io

读取二进制文件时我遇到了一个非常奇怪的问题。

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编辑器中,对于那个位置它是'/',但我把它读作'&gt;'。这很奇怪,因为从ftell的打印输出值来看,它是正确的位置,前后读取的值是预期值(obLength = 1;下一个值rawDataIndex == 4294967295)。

我怎么来'&gt;'当我发现'/'时。我试过fread(&amp; objPath,sizeof(unsigned char),obLength,f); fread(&amp; objPath,1,obLength,f); 他们都是'&gt;'; 任何人都可以帮我吗? 感谢

3 个答案:

答案 0 :(得分:1)

objPath=new char[obLength + 1];
cout<<"i am at"<<ftell(f)<<endl;
fread(objPath,sizeof( char),obLength,f);
objPath[obLength]='\0';

答案 1 :(得分:1)

我看不出上面的代码有什么问题,除非你正在进行非法的记忆位置,因为你分配了:

objPath=new char[obLength];

然后执行:

objPath[obLength]='\0';

您应该已分配new char[obLength+1]为'\ 0'预留足够的空间。

另一件事是您在读取文件后打印ftell 的结果。这真的是你想要的吗?

答案 2 :(得分:0)

您的010编辑器是否以十六进制显示位置而不是十进制?您以编程方式将其打印为十进制,以便可以解释您所看到的差异。

编辑:你的文件是什么样的? <一个字符是否与您期望的/不同?您是否尝试过一次读取一个字符并找出/实际存在哪个偏移量?