1

int をバイナリ形式で格納するファイルがあります。そして、int データを取り、それをファイル内の特定の位置に挿入する関数を C++ で作成しています。

void AddData(int position, int data);
  • position は、データを挿入する必要があるインデックスです。
  • data は、挿入される int 値です。

コード

void AddData(int position, int data)
{

    fstream os;        
    char buff[4096];
    cnt1 = position;
    cnt2+=(data_cnt-cnt1); // data_cnt is global var to cout the no. of data items 

    os.open("edata.dat", ios::out | ios::in | ios::binary );

    os.seekg(0);                    // start from beg
    os.seekg(cnt1*sizeof(int));     // move to position at which data has to be inserted
    os.read(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); // read rest of file 
    os.seekg(cnt1*sizeof(int));     // move back to previous position
    cout << os.tellg();
    os.write( reinterpret_cast<char*>(&data), sizeof(int) ); //add data
    os.write(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); //write back the read data
    data_cnt++;
}

関数が初めて呼び出されると、データ項目が 2 回追加されたことを示します。関数が 2 回呼び出されると、tellg() は -1 を示します。

わからない、どうしたの?

4

2 に答える 2

0

私が知る限り、 cnt2 はint が挿入され た後の int の数を表すためのものですよね?

その場合cnt2 = data_cnt-cnt1、 ではなくである必要がありcnt2 += data_cnt-cnt1ます。呼び出しの間に何も保存する必要がないため、おそらくこれらのローカル変数を作成する必要があります。

関数を初めて呼び出すときは、偶然にも正しい値を持つ cnt2 を取得している可能性があります。2 番目の呼び出しでは、(インクリメントしているため) 正しい値の 2 倍に設定されているため、読み取りは失敗し、ストリームはエラー状態になります。

ただし、データが2回追加される理由はわかりません。おそらく、cnt2 のバグを修正すれば、機能し始めるかもしれません。

于 2012-08-05T05:15:24.633 に答える