我工作的一段代码做一些压缩,而且我写了一个比特流类。
我流类持续跟踪,我们正在阅读的当前位和当前字节(无符号字符)的。
我注意到,从文件读取的下一个无符号字符,如果我用>>操作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参考
如果你不解析文本,不使用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
我想这可能永远都没有明显的先验。
operator>>
是格式化输入 。 它会读出"23"
,如果你流它变成为一个整数int
,它会标记之间吃空白。 get()
另一方面是未格式化的 ,逐字节输入。
C ++的格式化输入( operator >>
)把char
和unsigned char
作为字符,而不是一个整数。 这是一个有点讨厌,但可以理解的。
你必须使用get
,它返回一个字节,而不是。
但是,如果你打开一个文件,二进制标志,你不应该使用格式化的I / O。 你应该用read
, write
和相关功能。 格式化的I / O将无法正常使用,因为它的目的是在文本格式,而不是二进制格式的操作。