c++ - 高效的二进制流

标签 c++

我希望将 16 位整数 block 流式传输到程序中。 (可以来自文件或标准输入,等等。)尽可能简洁,我的起点是计算输入程序的八位字节:

#include <cassert>
#include <cstdint>
#include <iostream>
int main() {
    int16_t samples[768];
    while (std::cin.good()) {
        std::cin.read(reinterpret_cast<char *>(samples), sizeof(samples));
        if (std::cin.gcount() == sizeof(samples)) {
            // ...
        }
    }
    assert(std::cin.eof());
    return 0;
}

虽然这可行,但我想确保我没有遗漏更多执行相同功能的 C++ 方法。 (创建一个 std::vector 并直接读入它的内存空间?)这应该是高效的,所以我假设一次读取一个 16 位整数并附加到一个 vector 是不可能的。

想法?

最佳答案

所写的代码应该读取一个 16 位值的数组。唯一的问题是它假定写入文件的字节顺序与读取时使用的字节顺序相同。从问题中不清楚是否是这种情况。在交换文件的情况下,例如在 x86 和 Sparc 机器之间,您通常选择 网络字节顺序 并在读取时使用 ntohs() 处理值(和 htons() 写作时)。尽管这些看起来像函数,但它们通常只是宏,不会对使用网络字节顺序的平台上的值做任何事情。

关于c++ - 高效的二进制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126155/

相关文章:

c++ - 如何在 g++ 中将 -std=c++11 定义为默认值

c++ - 无法将 'const char **' 转换为 'const char*'

c++ - 这是什么类型的类模板定义?

c++ - 使用指针C++为二维数组赋值

c++ - 来自 C++ 方法的消息传递 Objective-C 方法?

c++ - C++中未解析的外部符号

c++ - 使用 boost::serialization 时如何刷新文件缓冲区?

c++ - 为什么 Freetype 不在我的 .exe 中加载字体

c++ - 如何将 CString 转换为 BYTE?

c++ - 稀疏建模软件编译错误