我正在编写一段代码进行压缩,然后编写了一个位流类。
我的位流类跟踪我们正在读取的当前位和当前字节(无符号字符)。
我注意到,如果在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/