我正在编写一段代码进行压缩,然后编写了一个位流类。

我的位流类跟踪我们正在读取的当前位和当前字节(无符号字符)。

我注意到,如果在istream类中使用>>运算符vs get()方法,则从文件读取下一个无符号字符的操作将有所不同。

我只是好奇为什么我得到了不同的结果?

例如:

this->m_inputFileStream.open(inputFile, std::ifstream::binary);
unsigned char currentByte;
this->m_inputFileStream >> currentByte;


this->m_inputFileStream.open(inputFile, std::ifstream::binary);
unsigned char currentByte;
this->m_inputFileStream.get((char&)currentByte);

附加信息:

具体来说,我正在读取的字节是0x0A,但是当使用>>时,它将读取为0x6F

我不确定它们之间的关系如何? (它们不是2的补码吗?)

>>运算符也被定义为也可以用于无符号字符(请参阅c++ istream class reference

最佳答案

如果您不解析文本,请不要使用operator>>operator<<。您将获得难以追踪的怪异错误。除非您知道要寻找什么,否则它们还可以抵抗单元测试。例如,读取uint8将在9上失败。

编辑:

#include <iostream>
#include <sstream>
#include <cstdint>

void test(char r) {
        std::cout << "testing " << r << std::endl;
        char t = '!';
        std::ostringstream os(std::ios::binary);
        os << r;
        if (!os.good()) std::cout << "os not good" << std::endl;
        std::istringstream is(os.str(), std::ios::binary);
        is >> t;
        if (!is.good()) std::cout << "is not good" << std::endl;
        std::cout << std::hex << (uint16_t)r
             << " vs " << std::hex << (uint16_t)t << std::endl;
}

int main(int argc, char ** argv) {
        test('z');
        test('\n');
        return 0;
}

产生:
testing z
7a vs 7a
testing

is not good
a vs 21

我想那永远不会是先验的。

关于c++ - C++ iostream >>运算符的行为与get()无符号字符的行为不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6792462/

10-10 13:20