gpt4 book ai didi

c++ - 在 C++ 中流式传输二进制文件

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:50 24 4
gpt4 key购买 nike

来自 C,我正在尝试使用 C++,并偶然发现了一些简单的事情,比如使用 ifstream 从文件中读取二进制数据到缓冲区中。在我看来,我有三个选项可以从文件中读取数据:

  • get(),获取单个字符,这对于将大量数据读取到内存缓冲区来说似乎很奇怪且效率低下;
  • read(),它不返回它实际读取了多少个字符;和
  • readsome(),如果我理解正确的话,它只会返回之前缓冲的数据,但不会从实际文件中读取任何新内容。

令我感到特别奇怪的是 read() 函数,在我看来它完全无法使用,因为它无法说明它实际放入提供的缓冲区中的字节数。然而,我看到的所有使用它的示例代码似乎都证实了这一点,并且通常会寻找文件的末尾以获取文件的大小,然后分配缓冲区。然而,这显然不适用于流数据。

那么实际上应该如何在 C++ 中使用非文本数据流式传输文件/管道/套接字?也许有比 ifstream 更好的工具吗?

最佳答案

What strikes me as particularly weird is the read() function, which seems to me to be completely unusable seeing as how it doesn't tell how many bytes it actually put into the supplied buffer.

read() 不会退出,直到 1) 请求的字符数已被读取,2) 达到 EOF,或 3) 发生错误。

read() 退出后,如果读取成功,可以调用gcount() 来查看有多少字符被读入缓冲区。如果在读取期间达到 EOF,流的 eofbit 状态将设置为 true,并且 gcount() 将返回比您请求的更少的字符。

如果读取失败,流的failbit 和/或badbit 状态设置为true。

std::ifstream ifs(...);
if (is) {
// stream opened...
//...
ifs.read(buffer, sizeof(buffer));
if (ifs) {
// read succeeded, EOF may have been reached...
std::streamsize numInBuf = ifs.gcount();
//...
} else {
// read failed...
}
//...
} else {
// stream not opened...
}

如果您使用流的 exceptions() 方法通过异常启用错误报告,则如果失败与您已为其启用异常的错误位。

std::ifstream ifs;
ifs.exceptions(std::ifstream::badbit | std::ifstream::failbit);
try {
ifs.open(...);
// stream opened...
//...
ifs.read(buffer, sizeof(buffer));
// read succeeded, EOF may have been reached...
std::streamsize numInBuf = ifs.gcount();
//...
} catch (const std::ios_base::failure &e) {
// stream failure...
}

So how is one actually supposed to stream a file/pipe/socket with non-text data in C++? Is there some better facility than ifstream, perhaps?

std::ifstream 专为基于文件的流而设计。对于管道,如果您的平台可以通过标准文件 API 访问管道,std::ifstream 应该可以工作。但是对于套接字,您需要使用更合适的 std::basic_istream 派生类,或者至少使用带有自定义 std 的标准 std::istream: :streambuf 派生类附加到它 ( example )。

关于c++ - 在 C++ 中流式传输二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30386251/

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