【问题标题】:ifstream::read keeps returning incorrect valuesifstream::read 不断返回不正确的值
【发布时间】:2018-03-02 13:56:27
【问题描述】:

我正在尝试读取 .bin 文件并返回十六进制值。在它必须读取诸如“F0”或“A0”之类的值之前,一切正常。它不断返回“ffffa0”或“ffffa0”。当我修改函数以返回十进制值时,控制台显示“-16”和“-96”,而所有其他正确的返回值都是正数。

void reader(string input) { 
int size;
char *storage;

ifstream file(input, ios::in | ios::binary);
if (file.is_open()) {
    file.seekg(0, ios::end);
    size = file.tellg();
    storage = new char[size];
    file.seekg(0, ios::beg);
    file.read(storage, size);
    file.close();
    for (int i = 0; i < size; i++) 
    {
        cout << hex << (int)storage[i] << endl;
    }
}
else {cout << "could not open file" << endl;}
}

【问题讨论】:

  • 代替(int)storage[i],试试这个:(storage[i] &amp; 0xFF)
  • 想想char 是什么。

标签: c++ ifstream


【解决方案1】:

“char”是一个有符号值。当设置 char 的最高位时,它表示一个负值(例如 0x80 到 0xFF)。当您将负值转换为不同大小的整数时,该值将被保留,从而导致十六进制值不同。

#include <iostream>

int main()
{
    char ch = 0xF0;
    int value = ch;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}

上面的程序打印“-16, fffffff0”。该程序实际上相当于:

#include <iostream>

int main()
{
    char ch = -16;
    int value = ch;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}

要获得预期的行为,您需要屏蔽该值:

#include <iostream>

int main()
{
    char ch = 0xF0;
    int value = ch & 0xFF;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}

【讨论】:

  • Nitpick: char 可能是有符号类型。不必如此。
  • @LightnessRacesinOrbit 虽然 char 可能是有符号类型,但在这里使用的任何编译器都绝对不是,否则不会有问题。 char 是大多数人可能使用的编译器中的有符号类型,因此差异主要是学术性的。
  • 不会改变您在 Stack Overflow 上的回答中提出不真实的广泛声明这一事实。
猜你喜欢
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2021-10-26
  • 2015-10-13
  • 2014-12-06
相关资源
最近更新 更多