bwe*_*ber 1 c++ buffer file istream
我试图用缓冲区将整个文件读入缓冲区 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上 - 是否有0x1A字节62?1).
这里:
std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg", std::ios::binary);
1我0x05在那个位置有一个JPEG文件; 快速浏览的EXIF格式的描述让我觉得我们都在寻找描述水平分辨率编码的TIFF数据字段,因为0x1A01和0x0500是常见的选择.
| 归档时间: | 
 | 
| 查看次数: | 589 次 | 
| 最近记录: |