我正在研究一个读取二进制文件的函数。我使用Visual Studio C ++,它在发布模式下完美运行,但在调试模式下却无法正常运行。我需要在调试中运行它以检测潜在的内存泄漏。
该函数只读取带有ifstream的二进制文件并存储值。在调试模式下,程序不读取任何内容。我试图在网上找到类似的问题,但一无所获(通常,程序可以在调试中工作,而不能在发行版中工作)。
main
文件以4个字符开头,上面的最少代码可以在“发布模式”下而不是在“调试模式”下完美读取并存储。我怀疑是将char *强制转换为问题,但我不明白为什么。
如果有人有主意,我不知道这两种配置之间的所有区别。
非常感谢您阅读。
答案 0 :(得分:0)
您可能想要
dtFile.read(identifier.data(), 4);
或等效的&identifier[0]
答案 1 :(得分:0)
我使用Visual Studio C ++,它在发布模式下完美运行,但在调试模式下却不完美。我需要在调试中运行它以检测潜在的内存泄漏。
似乎在发布模式下工作的可能性很小,因为它无法正常工作
我怀疑是将char *强制转换为问题
你是对的,在做
string identifier; identifier.resize(4); ifstream adtFile(m_nameFile, ios::in | ios::binary); adtFile.read((char*)&identifier, sizeof(::uint32_t));
您不会像预期那样在内部缓冲区中写入4个字符,而是在 std :: string 实例上写入,但行为未定义
最小的变化是
string identifier;
identifier.resize(sizeof(::uint32_t));
ifstream adtFile(m_nameFile, ios::in | ios::binary);
adtFile.read((char*)identifier.data(), sizeof(::uint32_t));
即使删除 const 也不是很清楚
但这真的是您想要的吗?为什么使用std::string
而不是像{p>这样的::uint32_t
::uint32_t v;
adtFile.read((char*)&v, sizeof(::uint32_t));
或者只是std::vector<unsigned char>
/ std::vector<::uint8_t>
(所有有关字节顺序的信息)
您的文件包含数字的外部表示形式(例如字符'1''2''3'和'4')还是其内部表示形式(例如字节0x0 0x0 0x4 0xD2或0xD2 0x4 0x0 0x0取决于创建文件时的字节顺序)。
在读取后检查可能的错误也很有趣。