Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++ 在Visual Studio中使用C+;读取二进制文件时出错+;_C++_Visual Studio 2012_File Io_Char_Binaryfiles - Fatal编程技术网

C++ 在Visual Studio中使用C+;读取二进制文件时出错+;

C++ 在Visual Studio中使用C+;读取二进制文件时出错+;,c++,visual-studio-2012,file-io,char,binaryfiles,C++,Visual Studio 2012,File Io,Char,Binaryfiles,这可能不是一个编程问题,但我仍然需要一些帮助。我正在学习如何处理文件流,我正在从文件中读取二进制数据。我将数据保存到一个char数组中,以便逐字节访问文件的数据。在文件中的某一点,我存储了一个无符号int,为了得到它,我使用重新解释转换将数据保存到一个变量中。然而,我不断地得到随机数据,我没有做任何事情来修复它。我甚至做了一些指针运算来找到我的无符号int在文件中的确切位置。在胡闹之后,我累了,把代码恢复到原来的状态。我再次运行它,由于某种原因,我正确地读取了数据。基本上,我知道在重新开始工作之

这可能不是一个编程问题,但我仍然需要一些帮助。我正在学习如何处理文件流,我正在从文件中读取二进制数据。我将数据保存到一个char数组中,以便逐字节访问文件的数据。在文件中的某一点,我存储了一个无符号int,为了得到它,我使用重新解释转换将数据保存到一个变量中。然而,我不断地得到随机数据,我没有做任何事情来修复它。我甚至做了一些指针运算来找到我的无符号int在文件中的确切位置。在胡闹之后,我累了,把代码恢复到原来的状态。我再次运行它,由于某种原因,我正确地读取了数据。基本上,我知道在重新开始工作之前不起作用的代码。什么会导致这种事情发生?我知道这是一个很长的解释,但我以前有过这种情况,我想知道是什么原因造成的。请随时问我任何澄清问题,如果有的话

下面是一个非常简单的例子,说明我正在做什么来获得更好的想法:

string binaryFile = "pathToBinaryFile.bin";
ifstream in(binaryFile, ios::binary | ios::in);

in.seekg(0, ios::end);
size_t totalNumOfBytes = inFile.tellg();
in.seekg(0, ios::beg);

char* savedData = new char[totalNumOfBytes];
in.read(savedData, totalNumOfBytes);

Node* node = reinterpret_cast<Node*>(savedData);

//Below is the line of code that kept breaking
unsigned int byteOffsetToNodeLocation = reinterpret_cast<unsigned int>(node.position);

node.position = reinterpret_cast<float*>(savedData + byteOffsetToNodeLocation);
string binaryFile=“pathToBinaryFile.bin”;
ifstream-in(二进制文件,ios::binary | ios::in);
in.seekg(0,ios::end);
size_t totalnumobytes=infle.tellg();
in.seekg(0,ios::beg);
char*savedData=new char[totalnumobytes];
in.read(savedData,totalnumobytes);
Node*Node=reinterpret\u cast(savedData);
//下面是一行不断中断的代码
无符号int byteOffsetOnDelocation=重新解释强制转换(node.position);
node.position=reinterpret_cast(savedData+byteOffsetToNodeLocation);
假设我有一个节点类,它存储指向浮点(Node.position)的指针,我首先读取存储到文件中的Node对象的数据。在该数据中,我存储了一个无符号int,它告诉我需要查找文件多远才能找到节点的浮点指针应该指向的浮点。问题就在“ByteOffsetOnDelocation”这一行,我不断地得到随机值,但当我恢复了为修复它所做的所有更改时,突然又重新工作了。我有其他人帮助我亲眼目睹了这一切。这是一个很难解释的问题,如果你自己没有看到它或没有经历过类似的事情,所以如果你需要更多的澄清,让我知道

我知道在重新开始工作之前不起作用的代码。 没有什么可以解释这一点,通常是因为您运行代码时没有重新编译,或者更改了文件,或者其他简单的解释。这很令人沮丧,但编译器在给定相同的输入时总是生成相同的结果;)

代码看起来不错(将int存储在float*中有点不寻常,但应该可以工作)。你接触过节点类吗?编译器有时会添加填充以对齐32位边界上的数据,这可能是一个问题。节点是类还是结构?我的意思是,如果它有任何虚拟方法,当你调用它时,它会爆炸,尽管看起来你没有任何虚拟方法

您可以检查的另一个问题是byteOffsetOnDelocation是否小于totalNumOfBytes。如果不是,则指向savedData缓冲区之外,则从*node.position读取的行为可能会随机崩溃


另一个可能的问题可能是前一个实例在文件上有一个锁,阻止代码读取它。(我不知道ifstream的共享策略是什么)。您应该检查totalNumOfBytes是否至少与sizeof(Node)一样大。

如果没有看到相关代码,很难说。这可能是因为你不小心运行一个没有用最新代码更改编译的版本。你为什么不共享你的伪/部分C++代码?你写的到现在为止??@ LMAR1093.这个解释如何?<代码>你的程序有bug 。假设您已经指出您正在使用指针、强制转换等,那么您的程序可能正在观察未定义的行为。当你犯了一个错误,比如内存损坏、缓冲区超支等,那么C++程序的运行就不是确定性的,也就是说,它将是可预见的崩溃。见鬼,它可能会运行“ok”多年,直到那个决定性的一天。向我们展示代码,然后我们可以看到您的描述是否与您所写的内容完全匹配。另外,关于jeremy的评论,我确保我正在运行的代码是用最新的更改重新编译的。这就是我完全困惑的原因。我确保在运行代码之前,每当我进行更改时都会重新编译代码,所以这不是问题所在。我也只有一个文件可以读取,我仔细检查了我的路径是否指向那个文件。这可能是一个简单的问题,但我可能对所有这一切都不熟悉,无法弄清楚这一点。与其对正在发生的事情感到困惑,不如提问。我刚刚更新了我的答案,并给出了一个回复,它太大了,不适合作为一个评论:(