C ++的iostream >>操作行为不同于得到()无符号字符(C++ iostrea

2019-09-30 03:19发布

我工作的一段代码做一些压缩,而且我写了一个比特流类。

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

我注意到,从文件读取的下一个无符号字符,如果我用>>操作VS get()方法中的IStream类是做不同的。

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

例如:

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

我不知道他们是如何甚至关系? (它们不是相互的二进制补码?)

>>操作符也被定义为无符号的字符以及工作然而(参照C ++类的IStream参考

Answer 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

我想这可能永远都没有明显的先验。



Answer 2:

operator>>格式化输入 。 它会读出"23" ,如果你流它变成为一个整数int ,它会标记之间吃空白。 get()另一方面是未格式化的 ,逐字节输入。



Answer 3:

C ++的格式化输入( operator >> )把charunsigned char作为字符,而不是一个整数。 这是一个有点讨厌,但可以理解的。

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

但是,如果你打开一个文件,二进制标志,你不应该使用格式化的I / O。 你应该用readwrite和相关功能。 格式化的I / O将无法正常使用,因为它的目的是在文本格式,而不是二进制格式的操作。



文章来源: C++ iostream >> operator behaves differently than get() unsigned char