Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中奇怪的文件读取问题+;:fread()_C++_C_File Io - Fatal编程技术网

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

C++ c+中奇怪的文件读取问题+;:fread(),c++,c,file-io,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 ch

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

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);
void metaDataProcess(文件*f){
无符号_uint32 obLength;
未签名的int32 numProp;
char*objPath;
无符号uu int32 rawDataIndex;
智力水平;
fread(&obLength,sizeof(obLength),1,f);
objPath=新字符[obLength];
cout
objPath=newchar[obLength+1];

cout我看不出上面的代码有任何错误,除了您正在访问一个非法内存位置,因为您分配了:

objPath=new char[obLength];
然后做:

objPath[obLength]='\0';
您应该已分配
新字符[obLength+1]
为“\0”保留足够的空间


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

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


<>编辑:你的文件看起来是什么样的?是不是有什么特殊的原因你没有使用<代码> IFSturis/Cube >?这不是非常的C++ C++语言来标记你的问题,或者C或C++。你会得到更好的答案。因为稍后我会为这个文件做一个实时的流。我不确定文件流是否能工作或是T。hat.@Sam这对两者都同样适用。
\uuuu int32
不是标准类型,也不是您可以声明自己的有效类型(保留以
\uuuuuuu
开头的任何内容)。C具有完全标准的
uint32\u t
int32\u t
(依此类推)您应该使用的。@Grey代码是正确的。如果不起作用,您的输入是错误的。您当然应该测试fread()等是否成功。我发现了问题。它是一个输入错误fread(&objPath,sizeof(char),obLength,f);=>fread(objPath,sizeof(char),obLength,f);谢谢,guysit可以显示十六进制和十进制。阅读前显示36,阅读后显示37,这是我想要的正确长度。但是,它只是给了我“>”而不是“/”我在发布后立即将其更改为obLength+1。但它不起作用。我在阅读前后打印2 ftell,以了解是否读取了正确的长度。它以十进制显示36和37。这是正确的位置。很奇怪为什么它没有给我正确的字符串。我有相同的C代码,它对我来说很好。当我在visual stduio 2010 vc++中使用这段代码时。它只是没有给我正确的东西…@Grey你的意思是这不适用于gcc,但适用于vc++?O你的意思是说如果你把它放在一个.c文件中,而不是一个.cpp文件中,它会工作吗?
objPath[obLength]='\0';