尝试将数字写入二进制文件时引发异常 我一直试图在C++中创建自己的二进制文件。我所做的是,我定义了一个结构,它实际上与dds报头的结构相同。所以我要做的是首先在二进制文件中写入一个小版本号,看看我处于哪个阶段,然后将整个结构写入文件,最后将一个简单的文本字符串写入文件。 但是,当我尝试将版本号写入文件时,会引发如下异常:“TestApplication7.exe中0x0F377236(msvcp140d.dll)处引发的异常:0xC0000005:访问冲突读取位置0x499602DB。”

尝试将数字写入二进制文件时引发异常 我一直试图在C++中创建自己的二进制文件。我所做的是,我定义了一个结构,它实际上与dds报头的结构相同。所以我要做的是首先在二进制文件中写入一个小版本号,看看我处于哪个阶段,然后将整个结构写入文件,最后将一个简单的文本字符串写入文件。 但是,当我尝试将版本号写入文件时,会引发如下异常:“TestApplication7.exe中0x0F377236(msvcp140d.dll)处引发的异常:0xC0000005:访问冲突读取位置0x499602DB。”,c++,C++,基本上,我所做的是在我的cpp文件顶部定义一个版本号,如下所示: #define VERSION_NR 0x499602DB 然后我只是想把这个数字写入二进制文件 下面是我的示例代码: void MyFile::Save(std::string ddsPath, MyFile::FileHeader header, const std::string texturePath) { header.PathLen = texturePath.length(); const

基本上,我所做的是在我的cpp文件顶部定义一个版本号,如下所示:

#define VERSION_NR 0x499602DB
然后我只是想把这个数字写入二进制文件

下面是我的示例代码:

 void  MyFile::Save(std::string ddsPath, MyFile::FileHeader header, const std::string texturePath) {
     header.PathLen = texturePath.length();
     const char* buffer{reinterpret_cast<const char*>(&texturePath)};
     const char* version{reinterpret_cast<const char*>(VERSION_NR)};

     std::ofstream output(ddsPath, std::ios::binary);
     output.write(version, sizeof(VERSION_NR)); //Here is where the exception is thrown
     ext->WriteStruct(output, header); //Writing the hole header to the file
     output << texturePath; //Outputting a simple text to the file
}

这是引发异常的原因,我不知道我做错了什么,因为我对C++编程很陌生。我确实尝试在“Save”方法中创建一个常量DWORD,而不是使用宏,但仍然得到了相同的异常。 我不知道这是否有帮助,但消息“访问冲突读取位置0x499602DB”与我的宏的值是同一个“位置”

如果有人能帮我,或者给我指出正确的方向,我会很感激的。
谢谢

VERSION\u NR不是变量,因此char*指向随机内存。
不要像处理其他数据那样使用宏、创建变量、在其上获取指针

VERSION\u NR不是变量,因此char*指向随机内存。
不要像处理其他数据那样使用宏、创建变量、在其上获取指针

如果我们去掉宏和许多其他不相关的代码,我们会得到:

int version = 0x499602DB;
const char* ch = reinterpret_cast<const char*>(version);
std::ofstream output("out.bin", std::ios::binary);
output.write(ch, sizeof(version));
或者,如果你想写一个字符串,那么就不要同时使用强制转换:

const char version[4] = {'\xDB','\x02','\x96','\x49'};
std::ofstream output("out.bin", std::ios::binary);
output.write(version, sizeof(version));
还请注意,一旦我们修复了此崩溃,以下内容也不正确:

const char* buffer{reinterpret_cast<const char*>(&texturePath)};

texturePath
是一个
std::string
对象。如果指向它的指针不能转换为
char*
c_str()
方法返回一个
const char*
指针,然后可以将该指针传递给
std::ofstream::write
,或者,如果我们去掉宏和大量其他不相关的代码,只需使用
output:

int version = 0x499602DB;
const char* ch = reinterpret_cast<const char*>(version);
std::ofstream output("out.bin", std::ios::binary);
output.write(ch, sizeof(version));
或者,如果你想写一个字符串,那么就不要同时使用强制转换:

const char version[4] = {'\xDB','\x02','\x96','\x49'};
std::ofstream output("out.bin", std::ios::binary);
output.write(version, sizeof(version));
还请注意,一旦我们修复了此崩溃,以下内容也不正确:

const char* buffer{reinterpret_cast<const char*>(&texturePath)};

texturePath
是一个
std::string
对象。如果指向它的指针不能转换为
char*
c_str()
方法返回一个
const char*
指针,然后可以将该指针传递给
std::ofstream::write
,或者,只需使用
output,首先去掉那些
reinterpret\u cast
s。对于初学者来说,规则是,
reinterpret\u cast
总是错误的。显示的代码似乎试图将指向
std::string
的指针重新解释为
const char*
。那就是。。。不去上班。这是C++如何工作的一个根本性误解,以及C++对象的全部内容。@当PeteBecker将一个数字写入二进制代码<代码> STD::OsFrase @ SAMVARSHIVCHKK是的UHM时,这是一个代码行,只是我在计算所有这些工作时所做的事情,很难避免。我没有在方法中的任何地方使用它,所以它只是一些我忘记删除的剩余内容。谢谢你指出@AlanBirtles--
重新解释演员阵容
在这里很容易避免<代码>静态强制转换(静态强制转换(&无论什么))
。这种强制转换组合不会将整数值转换为指针。首先要去掉那些
reinterpret\u cast
s。对于初学者来说,规则是,
reinterpret\u cast
总是错误的。显示的代码似乎试图将指向
std::string
的指针重新解释为
const char*
。那就是。。。不去上班。这是C++如何工作的一个根本性误解,以及C++对象的全部内容。@当PeteBecker将一个数字写入二进制代码<代码> STD::OsFrase @ SAMVARSHIVCHKK是的UHM时,这是一个代码行,只是我在计算所有这些工作时所做的事情,很难避免。我没有在方法中的任何地方使用它,所以它只是一些我忘记删除的剩余内容。谢谢你指出@AlanBirtles--
重新解释演员阵容
在这里很容易避免<代码>静态强制转换(静态强制转换(&无论什么))
。这种强制转换组合不会将整数值转换为指针。