ifstream读取二进制文件在发布模式下工作,但在调试模式下不工作

时间:2019-05-04 13:29:47

标签: c++ visual-c++

我正在研究一个读取二进制文件的函数。我使用Visual Studio C ++,它在发布模式下完美运行,但在调试模式下却无法正常运行。我需要在调试中运行它以检测潜在的内存泄漏。

该函数只读取带有ifstream的二进制文件并存储值。在调试模式下,程序不读取任何内容。我试图在网上找到类似的问题,但一无所获(通常,程序可以在调试中工作,而不能在发行版中工作)。

main

文件以4个字符开头,上面的最少代码可以在“发布模式”下而不是在“调试模式”下完美读取并存储。我怀疑是将char *强制转换为问题,但我不明白为什么。

如果有人有主意,我不知道这两种配置之间的所有区别。

非常感谢您阅读。

2 个答案:

答案 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取决于创建文件时的字节顺序)。

在读取后检查可能的错误也很有趣。

相关问题