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- copy(iter.begin(), iter.end(), std::back_inserter(myVector));

エラー: 'class std::istreambuf_iterator' には 'begin' という名前のメンバーがありません</p>

エラー: 'class 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*ます。それがエラーメッセージの内容です。

begin()Re: 5. はい、イテレータにはandend()メンバー関数がありません。ファイルの先頭にイテレータが既にあります (以前の問題が解決された後)。その名はiter。ここで、ファイルの終わりイテレータが必要です。正しい呼び出しはstd::copy(iter, end_iter, std::back_inserter(myVector));.

于 2012-09-12T14:17:50.620 に答える
4

1- ostreambuf_iterator out_it (ファイル);

エラー: '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));
}

ただし、読み取りは、一度に 1 つずつ行う必要があります。

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 に答える