c++ - ascii 和二进制 - 按应有的方式显示,但读取返回垃圾

标签 c++ file-io

这在主要部分:

std::ofstream rainbow_file("rainbow.bin", std::ios::binary);
rainbow_file.write((const char*) p.pass, password::PASSWORD_SIZE);
rainbow_file.write((const char*) h.hash_, hash::HASH_SIZE);

哪里:

class hash
{
public:
    static const size_t HASH_SIZE = 32;
    uint8_t hash_[HASH_SIZE];
...
}
// similar for pass

我在 Notepad++ 中打开 Rainbow.bin 文件,看到我的通行证为通行证(字符 A-Z、@、!、a-z、0-9)以及哈希值的二进制垃圾。稍后我会这样做:

std::ifstream rainbow_file("rainbow.bin", std::ios::binary);
rainbow_file.read((char*) p.pass, password::PASSWORD_SIZE);
rainbow_file.read((char*) h.hash_, hash::HASH_SIZE);

我将通行证作为二进制垃圾返回。我尝试了很多事情(比如打开两个流 - 一个不是二进制模式 - 并使用eekg单独移动文件指针,尝试各种转换等),但在我的一生中,我无法让它工作。我很好奇为什么。并感到沮丧。我在 npp 中重复一遍,我看到所有事情都按顺序排列。

编辑:这些是不同的控制流,并且流已正确关闭()

编辑2:有效!仍请参阅下面的答案和评论,了解更多 C++ 方法

最佳答案

std::ifstream rainbow_file("rainbow.bin", std::ios::binary);  /* OK */

rainbow_file.read((char*) p.pass, password::PASSWORD_SIZE);   /* KO */
rainbow_file.read((char*) h.hash_, hash::HASH_SIZE);

应替换为:

rainbow_file.read ( reinterpret_cast < char*> (&(p.pass)), password::PASSWORD_SIZE * sizeof(uint_8t));
rainbow_file.read ( reinterpret_cast < char*> (&(h.hash_)), hash::HASH_SIZE * sizeof(uint_8t));

这样您就不会假设 sizeof ( uint_8t ) == sizeof (char)。

在 C++ 中,h.hash_ 是 uint_8t(&)[hash::HASH_SIZE] 类型的数组,而不是指针...您可以通过让编译器检查强制转换来轻松发现问题,但不幸的是,您已经使用 C 风格的强制转换,未检查。

切勿在 C++ 程序中使用 C 风格的转换方法!!!

但事实上你可以像纯 C++ 那样完成它,不会出现错误:

std::ifstream rainbow_file("rainbow.bin", std::ios::binary);

rainbow_file >> p.pass >> h.hash_;

关于c++ - ascii 和二进制 - 按应有的方式显示,但读取返回垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778198/

相关文章:

c# - 为什么这个文件实际上没有写入磁盘?

c# - Excel 工作簿导入错误

c++ - 为什么 switch 语句不能应用于字符串?

c++ - 如何检测无模式 CDialog 是否已关闭?

c++ - C++:如何使用正则表达式从字符串中提取单词

Python pickle/unpickle 到/从文件中提取列表

java - 在 Java 中,新建文件的默认位置是什么?

c# - 更快地读取文件并快速获取像素颜色?

c++ - 模板类重载 std::bind 成员函数

c++ - 在 C++ 中嵌套的 unordered_maps