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];
coutobjPath=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';