正确读取二进制文件并使用流迭代器

Reading binary files and using stream iterators correctly

本文关键字:迭代器 读取 二进制文件      更新时间:2023-10-16

我试图使用这种迭代器,但以下代码出现错误:

void linearMatrix::Write_File_Matrix(const char *Path)
{
    ofstream FILE(Path, std::ios::out | std::ofstream::binary);
    FILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
    FILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
    ostreambuf_iterator<float> out_it (FILE);
    copy(myVector.begin(), myVector.end(), out_it);
}
void linearMatrix::Read_File_Matrix(const char *Path)
{
    ifstream FILE(Path, std::ios::in | std::ifstream::binary);
    if(!FILE)
    {
        cerr << "Cannot open the file" << endl;
        exit(1);
    }
    FILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));
    FILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));
    istreambuf_iterator<float> iter(FILE);
    copy(iter.begin(), iter.end(), std::back_inserter(myVector));
}

问题是:

1-ostreambuf_iterator<float> out_it (FILE);

错误:从"void*"到的转换无效'std::ostreambuf_titerator::streambuf_type*{akastd::basic_streambuf>*}'[-f许可]

2-FILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));

错误:从"const char*"到"std::basic_stream::char_type*{aka char*}"的转换无效[-fpermission]

3-FILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));

错误:从"const char*"到的转换无效'std::basic_stream::char_type*{aka char*}'[-fpermission]

4-std::ifstream FILE(Path, std::ios::in | std::ifstream::binary);

错误:从"void*"到的转换无效'std::ostreambuf_titerator::streambuf_type*{akastd::basic_streambuf>*}'[-f许可]

5-复制(iter.begin(),iter.end(),std::back_inserter(myVector));

错误:"class std::istreambuf_editor"没有名为的成员"开始"

错误:"class std::istreambuf_editor"没有名为的成员"结束"

我做错了什么?我使用的是CUDA的nsight eclipse,但使用g++编译了一个C++项目。我指的是:正确地将std::矢量读取和写入文件

#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
using namespace std;
void Write_File_Matrix(const char *Path)
{
    float myWidth = 0;
    float myHeight = 0;
    vector<float> v;
    v[0] = 1;
    v[1] = 2;
    v[2] = 3;
    ofstream outFILE(Path, ios::out | ofstream::binary);
    outFILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
    outFILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
    ostreambuf_iterator<float> out_it (outFILE);
    copy(V.begin(), V.end(), out_it);
}
void Read_File_Matrix(const char *Path)
{
    float myWidth = 0;
    float myHeight = 0;
    vector<float> v;
    ifstream inFILE(Path, ios::in | ifstream::binary);
    if(!inFILE)
    {
        cerr << "Cannot open the file" << endl;
        exit(1);
    }
    inFILE.read(reinterpret_cast<const char *>(&myWidth), sizeof(myWidth));
    inFILE.read(reinterpret_cast<const char *>(&myHeight), sizeof(myHeight));
    istreambuf_iterator<float> iter(inFILE);
    copy(iter.begin(), iter.end(), std::back_inserter(myVector));
}
int main() {
    Write_File_Matrix("M.dat");
    Read_File_Matrix("R.dat");
    return 0;
}

1-ostreambuf_titerator out_it(FILE);

错误:从"void*"到"std::ostreambuf_editor::streambuf_type*{aka std::basic_streambuf>*}"的转换无效[-fpermission]

std::ostreambuf_iterator将流的字符类型作为模板参数,而不是要转换为的类型。尝试:

std::ostreambuf_iterator<char> out_it(FILE);

4号同上。


编辑:让我们解决你的大问题而不是小问题:

不要麻烦迭代器,只需一次性写出矢量数据:

void Write_File_Matrix(const char *Path)
{
    float myWidth = 0;
    float myHeight = 0;
    vector<float> v;
    v[0] = 1;
    v[1] = 2;
    v[2] = 3;
    ofstream outFILE(Path, ios::out | ofstream::binary);
    outFILE.write(reinterpret_cast<const char *>(&myWidth), sizeof(float));
    outFILE.write(reinterpret_cast<const char *>(&myHeight), sizeof(float));
    outFile.write(reinterpret_cast<const char *>(&v[0]), v.size()*sizeof(float));
}

然而,阅读仍然需要一件一件地进行。

void Read_File_Matrix(const char *Path)
{
    float myWidth = 0;
    float myHeight = 0;
    vector<float> v;
    ifstream inFILE(Path, ios::in | ifstream::binary);
    if(!inFILE)
    {
        cerr << "Cannot open the file" << endl;
        exit(1);
    }
    inFILE.read(reinterpret_cast<char *>(&myWidth), sizeof(myWidth));
    inFILE.read(reinterpret_cast<char *>(&myHeight), sizeof(myHeight));
    float f;
    while( inFILE.read(reinterpret_cast<char *>(&f), sizeof(f)))
      v.push_back(f);
}
编辑:删除了对1,4的错误答案。

回复:2,3。你不能读const char*;它是常量。改为强制转换为char*。这就是错误消息所说的。

回复:5。是的,迭代器没有begin()end()成员函数。您已经在文件的开头有了一个迭代器(一旦之前的问题得到解决)。它的名字叫iter。现在您需要一个文件尾迭代器,正确的调用是std::copy(iter, end_iter, std::back_inserter(myVector));