C ++ iostream>>运算符的行为与get()unsigned char不同

时间:2011-07-22 15:39:50

标签: c++ iostream unsigned-char

我正在编写一段代码来进行压缩,我写了一个比特流类。

我的bitstream类跟踪我们正在读取的当前位和当前字节(unsigned char)。

我注意到如果我使用>>那么从文件中读取下一个无符号字符的方式会有所不同。 istream类中的operator vs get()方法。

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

例如:

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

VS

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

其他信息:

具体来说,我读的字节是0x0A但是当使用>>时它会将其读作0x6F

我不确定他们甚至是如何相关的? (他们不是彼此的2s补充?)

>>运算符也被定义为也适用于unsigned char(参见c++ istream class reference

3 个答案:

答案 0 :(得分:2)

operator>>用于格式化输入。如果将它流式传输到"23",它会将int读为整数,它会在令牌之间占用空格。另一方面,get()用于无格式,按字节输入。

答案 1 :(得分:1)

如果您不解析文字,请不要使用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

我认为这在先验中是不可能的。

答案 2 :(得分:0)

C ++的格式化输入(operator >>)将charunsigned char视为字符,而不是整数。这有点烦人,但可以理解。

您必须使用get,而不是返回下一个字节。

但是,如果使用二进制标志打开文件,则不应使用格式化I / O.您应该使用readwrite和相关功能。格式化的I / O将无法正常运行,因为它旨在以文本格式而非二进制格式运行。