有没有一种优雅的方法来读取二进制文件并将其内容复制到向量<int>

Is there an elegant way to read a binary file and copy its content to a vector<int>

本文关键字:复制 向量 gt int lt 二进制文件 一种 读取 方法 有没有      更新时间:2023-10-16

我尝试了此方法:

void read(vector<int> &vec, string filename)
{
    std::ifstream file(filename, std::ios::binary | std::fstream::binary);
    if (!file.is_open()) throw runtime_error("could not open file");
    //std::istreambuf_iterator<char> start(file), end;
    std::istream_iterator<int> start(file), end;
    //std::istreambuf_iterator<char> start(file), end;
    vec = vector<int>(start, end);
    file.close();
}
void write(vector<int> &vec, string filename) {
    std::ofstream file(filename, std::ios::binary | std::fstream::binary);
    if (!file.is_open()) throw runtime_error("could not open file");
    copy(
        vec.begin(),
        vec.end(),
        //std::ostreambuf_iterator<char>(file)
        std::ostream_iterator<int>(file)
    );
    file.close();
}
int main(){
    vector<int> vec =
    {124,5,543,6,756,6,3,234,5,5,765}, vec2;
    write(vec, "thing.bin");
    read(vec2, "thing.bin");
    for (auto&a : vec2) cout << a << endl;
    system("PAUSE");
}

评论的代码是我尝试的替代迭代器。

问题是std::ostreambuf_iterator<int>(file)是文件的无效迭代器。我需要做reinterpret_cast吗?我是否有义务使用fstream .write()read()

void read(vector<int> &vec, string filename)
{
    std::ifstream file(filename, std::ios::binary | std::fstream::binary);
    if (!file.is_open()) throw runtime_error("could not open file");
    file.seekg(0, ios_base::end);
    int size = file.tellg() / sizeof(int);
    vec = vector<int>(size);
    file.seekg(0, file.beg);
    file.read(reinterpret_cast<char*>(vec.data()), size*sizeof(int));
    file.close();
}
void write(vector<int> &vec, string filename) {
    std::ofstream file(filename, std::ios::binary | std::fstream::binary);
    if (!file.is_open()) throw runtime_error("could not open file");
    file.write(reinterpret_cast<const char*>(vec.data()), vec.size() * sizeof(int));
    file.close();
}
int main(){
    vector<int> vec =
    {0,1,2,3,-1,127,128,1023,1024}, vec2;
    write(vec, "thing.bin");
    read(vec2, "thing.bin");
    for (auto&a : vec2) cout << a << endl;
    return 0;
}