是否有一种优雅的方式来读取二进制文件并将其内容复制到vector <int>

时间:2017-12-07 06:25:04

标签: c++ fstream ifstream ofstream

我试过这个方法:

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()吗?

1 个答案:

答案 0 :(得分:0)

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;
}