我正在编写一段代码来进行压缩,我写了一个比特流类。
我的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
)答案 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 >>
)将char
和unsigned char
视为字符,而不是整数。这有点烦人,但可以理解。
您必须使用get
,而不是返回下一个字节。
但是,如果使用二进制标志打开文件,则不应使用格式化I / O.您应该使用read
,write
和相关功能。格式化的I / O将无法正常运行,因为它旨在以文本格式而非二进制格式运行。