gpt4 book ai didi

c++ - istream::read 和 istream::operator 之间的区别>>

转载 作者:太空狗 更新时间:2023-10-29 23:28:30 29 4
gpt4 key购买 nike

这里有两段代码,我起初认为它们应该是等价的:

{
std::ifstream stream("test.bin", std::ios_base::in | std::ios_base::binary);
unsigned char count = 128;
unsigned char read = 0;
unsigned char scanline[128];
long long start = stream.tellg();
while (count--) {
stream >> scanline[read++]; // <---- This is the only line which differs
}
long long end = stream.tellg();
std::cout << end - start << "\n";
}

{
std::ifstream stream("test.bin", std::ios_base::in | std::ios_base::binary);
unsigned char count = 128;
unsigned char read = 0;
unsigned char scanline[128];
long long start = stream.tellg();
while (count--) {
stream.read((char*)&scanline[read++], 1); // <---- This is the only line which differs
}
long long end = stream.tellg();
std::cout << end - start << "\n";
}

我的问题是第一个版本输出 153(可能取决于输入数据)而第二个版本输出 128(这是我所期望的)。这一定与第一个版本中提取数据的方式有关,但我不明白为什么它不起作用。它不应该只是调用:

istream& operator>> (istream& is, unsigned char& ch);

然后每次移动filepos一个字节?

最佳答案

如果您阅读了 operator>> 的说明(例如 here ),然后您会看到它在读取之前跳过空格,直到再次遇到空格。空白不仅是空格 ( 0x20),还包括制表符 (0x09) 和换行符 (0x0a)。

因此,如果您的二进制数据包含被视为文本文件空白的字节,那么 operator>>将读取但不存储它们,这将扭曲 tellg 报告的数字.

关于c++ - istream::read 和 istream::operator 之间的区别>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794820/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com