0

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

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_iterator::streambuf_type* {aka std::basic_streambuf >*}' [-fpermissive] 的无效转换

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

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

3-FILE.read(reinterpret_cast<const char *>(&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”没有名为“begin”的成员</p>

错误:“类 std::istreambuf_iterator”没有名为“end”的成员</p>

我究竟做错了什么?我正在使用 CUDA 的 nsight eclipse,但使用 g++ 编译 C++ 项目。我指的是:正确读取和写入 std::vector 到文件中

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

2 回答 2

4

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

Re: 2, 3. 你不能读成const char*; 它是const。改为a char*。这就是错误消息所说的。

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

于 2012-09-12T14:17:50.620 回答
4

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);
}
于 2012-09-12T14:27:40.207 回答