【问题标题】:Reading binary files and using stream iterators correctly正确读取二进制文件并使用流迭代器
【发布时间】:2012-09-05 13:52:38
【问题描述】:

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

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&lt;float&gt; out_it (FILE);

错误:从“void*”到的无效转换 'std::ostreambuf_iterator::streambuf_type* {aka std::basic_streambuf >*}' [-fpermissive]

2-FILE.read(reinterpret_cast&lt;const char *&gt;(&amp;myWidth), sizeof(myWidth));

错误:从“const char*”到“std::basic_istream::char_type* {aka char*}”的无效转换 [-fpermissive]

3-FILE.read(reinterpret_cast&lt;const char *&gt;(&amp;myHeight), sizeof(myHeight));

错误:从“const char*”到的无效转换 'std::basic_istream::char_type* {aka char*}' [-fpermissive]

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

错误:从“void*”到的无效转换 'std::ostreambuf_iterator::streambuf_type* {aka std::basic_streambuf >*}' [-fpermissive]

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

错误:‘class std::istreambuf_iterator’没有名为的成员 ‘开始’

错误:‘class std::istreambuf_iterator’没有名为的成员 ‘结束’

我做错了什么?我正在使用 CUDA 的 nsight eclipse,但使用 g++ 编译 C++ 项目。我参考:Reading and writing a std::vector into a file correctly

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

【问题讨论】:

  • 请提供SSCCE
  • 好的。我会放线性矩阵类的头部和实现。
  • first S 的缩写。你能在一个 10 行的程序中重现这个问题吗?
  • 感谢您提供简短的独立程序。它确实有帮助。
  • 也谢谢罗伯。你给了我很好的答案和建议。

标签: c++ stl compiler-errors iterator iostream


【解决方案1】:

1- ostreambuf_iterator out_it (FILE);

错误:从‘void*’到‘std::ostreambuf_iterator::streambuf_type* {aka std::basic_streambuf >*}’的无效转换 [-fpermissive]

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

【讨论】:

  • 非常感谢 Rob 的帮助。但是我的编译器给了我:错误:从 'void*' 到 'std::ostreambuf_iterator::streambuf_type* {aka std::basic_streambuf >*}' 的无效转换 [- fpermissive] 用于 outFile.write 向量:S
  • 这可能是由于我的错字:尝试v.size(),而不是v.size
  • Rob 我试过 read 但编译器给了我错误,它们和上面的一样
  • Rob 我改变了它:inFILE.read(reinterpret_cast(&myWidth), sizeof(float));inFILE.read(reinterpret_cast(&myHeight), sizeof(float)) ;现在我正在尝试解决 while() 语句
  • 您可以将向量调整为预期大小,然后将所有信息直接读入vector.data()
【解决方案2】:

编辑:删除了对 1、4 的错误答案。

Re: 2, 3. 你不能读入const char*;它是常量。改为使用char*。这就是错误消息的内容。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
相关资源
最近更新 更多