1

fstreamを使用してlongの配列をバイナリファイルに読み書きしようとしています。私は次のように定義された配列を持っています:

#define MAX_SUB_BUCKETS 27    
unsigned long origin[MAX_SUB_BUCKETS];
unsigned long nextAvail[MAX_SUB_BUCKETS];
fstream fh;

ファイルを開いて、次のことを試します。

fh.open(fileName.c_str(), fstream::in | fstream::out | fstream::binary);
if (fh.fail()) {
         // create new file here and write all zeroes to it (plus header)
} else {
          fh.seekg (0, ios::beg);
          for (i=0;i<MAX_SUB_BUCKETS;i++) {
                     fh.read(origin[i],sizeof(long));               
          }
          for (i=0;i<MAX_SUB_BUCKETS;i++) {
                     fh.read (nextAvail[i],sizeof(long));
          }
}

コンパイラは次のエラーで文句を言います:

tld.hh:39: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:39: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:42: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:42: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:45: error: invalid conversion from 'void*' to 'char*'
tld.hh:45: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'

ここで、39行目は最初のfh.read()呼び出しです。私がここで何を間違っているのかわからない(これらのことについての私の基本的な知識の欠如を除いて)。また、originまたはnextAvailの配列全体を、ループではなく単一のステートメントで読み取る方法があると確信しています。

4

2 に答える 2

0

エラーから、sで動作するストリームreadでsを使用しようとしているように見えます。次のようなもので試すことができます:unsigned longchar

fh.read( reinterpret_cast< char* >( &origin[i] ), sizeof( long ) );
于 2012-12-23T04:39:22.240 に答える
0

バイナリファイルはバイトの配列であるため、ファイルに保存するデータを特定の形式のバイトの配列に変換するルーチンを作成する必要があります。それらを読み戻すには、ファイルからバイトの配列を読み取り、それらを希望する形式に変換するルーチンを作成する必要があります。

基本的に、シリアル化(構造化データをバイトの束に)および逆シリアル化(バイトの束を構造化データに)ルーチンを作成する必要があります。XMLやJSON(または生のテキスト)のような形式を使用することをお勧めします。これらは非常に理解しやすく、これらの形式との間で変換するライブラリが広く利用できるためです。

于 2012-12-23T04:47:42.820 に答える