【发布时间】:2015-09-27 10:34:02
【问题描述】:
我试图使用 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 个字节,然后设置了故障位。生成的输出如下:
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", ios_base::binary);