gpt4 book ai didi

c++ - std::ifstream::read() 读取少于请求并无明显原因设置 failbit

转载 作者:行者123 更新时间:2023-11-30 00:48:07 29 4
gpt4 key购买 nike

我试图使用 std::ifstream 将整个文件读入缓冲区,但没有明显的原因失败,所以我构建了一个最小的代码示例来演示问题:

std::vector<char> vec;
vec.resize(1000);
std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg");
file.exceptions(std::ifstream::badbit | std::ifstream::failbit | std::ifstream::eofbit);
std::cout << file.good() << std::endl;
try {
file.read(vec.data(), 100);
} catch (std::ios_base::failure f) {
std::cout << f.what() << " Characters extracted: " << file.gcount() << std::endl;
} catch (...) {
std::cout << "Some other error" << std::endl;
}
std::cout << "Done" << std::endl;
file.close();

我要读取的文件大小为 48kb,因此读取 100 字节应该不是问题。 1000 字节大的缓冲区,这样应该也可以。现在,发生的情况是流仅读取 61 个字节,然后设置 failbit。生成的输出如下:

1
ios_base::failbit set: iostream stream error Characters extracted: 61
Done

所以出于某种原因,故障位设置在 61 字节之后。如果我读取少于 61 个字节,它就可以工作。如果我尝试阅读更多内容,它也会在 61 处失败。我还尝试了其他类似大小的文件,同样的问题。一些完全不同的不同大小的文件表现出相同的行为,但在 166 字节之后。

现在,如果我使用 Qt 的 QFile 类读取数据,一切正常,我可以读取整个文件。代码看起来像这样:

QFile file(path);
std::vector<char> buffer;
buffer.resize(file.size());
if (!file.open(QIODevice::ReadOnly)) return;
file.read(buffer.data(), file.size());
file.close();

我知道,现在你会说我在这里只读了文件的大小,但实际上超过了 61 个字节。读取固定的 100 也是没有问题的。

最佳答案

std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg");

糟糕!您正在以文本模式打开文件。

根据您的平台,任何数量的讨厌的二进制字符都可能使流认为数据流已经结束,因为不同的平台使用不同的“哨兵字符”来表示这一点(例如 Ctrl+Z 或 0x1A 在 Windows 上 — 字节 62 处是否有 0x1A1)。

这里:

std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg", std::ios::binary);

1 我在该位置有一个带有 0x05 的 JPEG 文件;快速浏览 an EXIF format description让我觉得我们都在查看描述水平分辨率编码的 TIFF 数据字段,因为 0x1A010x0500 是常见选项。

关于c++ - std::ifstream::read() 读取少于请求并无明显原因设置 failbit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807001/

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