将二进制文件读入 vector<char> 读取不到完整文件
Reading binary file into vector<char> reading less than full file
我有二进制文件,我正在尝试将其内容读入向量。所有文件的大小都相同,但使用我下面的代码,最终矢量大小总是比文件大小小一点,并且文件之间不同(但每个文件都相同)。我对这里发生的事情感到困惑...
#include <fstream>
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char *argv[]) {
std::string filename(argv[1]);
// Get file size
std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
int size = (int)ifs.tellg();
std::cout << "Detected " << filename << " size: " << size << std::endl; // seems correct!
// Load file
ifs.seekg(0, std::ios::beg);
std::istream_iterator<char unsigned> start(ifs), end;
std::vector<char unsigned> v;
v.reserve(size);
v.assign(start, end);
std::cout << "Loaded data from " << filename << ", with " << v.size() << " elements" << std::endl;
}
在文件上尝试这个,我得到这个:
Detected foo_binary.bin size: 2113753
Loaded data from foo_binary.bin, with 2099650 elements
2113753 数字是以字节为单位的文件的正确大小。
在另一个相同大小的文件上尝试此操作,矢量大小最终将包含 2100700 个元素。多一点,但又不是整个文件。
这是怎么回事?
有多个流迭代器。 class 模板 std::istream_iterator<T>
用于 格式化的 输入,即,它将在尝试读取类型 T
的对象之前跳过前导空格。
从外观上看,您需要 std::istreambuf_iterator<char>
用于遍历文件中的字符,而不是进行任何跳过。
我有二进制文件,我正在尝试将其内容读入向量。所有文件的大小都相同,但使用我下面的代码,最终矢量大小总是比文件大小小一点,并且文件之间不同(但每个文件都相同)。我对这里发生的事情感到困惑...
#include <fstream>
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char *argv[]) {
std::string filename(argv[1]);
// Get file size
std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
int size = (int)ifs.tellg();
std::cout << "Detected " << filename << " size: " << size << std::endl; // seems correct!
// Load file
ifs.seekg(0, std::ios::beg);
std::istream_iterator<char unsigned> start(ifs), end;
std::vector<char unsigned> v;
v.reserve(size);
v.assign(start, end);
std::cout << "Loaded data from " << filename << ", with " << v.size() << " elements" << std::endl;
}
在文件上尝试这个,我得到这个:
Detected foo_binary.bin size: 2113753
Loaded data from foo_binary.bin, with 2099650 elements
2113753 数字是以字节为单位的文件的正确大小。
在另一个相同大小的文件上尝试此操作,矢量大小最终将包含 2100700 个元素。多一点,但又不是整个文件。
这是怎么回事?
有多个流迭代器。 class 模板 std::istream_iterator<T>
用于 格式化的 输入,即,它将在尝试读取类型 T
的对象之前跳过前导空格。
从外观上看,您需要 std::istreambuf_iterator<char>
用于遍历文件中的字符,而不是进行任何跳过。