2009-08-20 7 views
0

特定のオフセットからバイナリデータを読み込もうとしています。seekgでバイナリデータを読み込めません。

私は次のようにデータを書き込む:

long RecordIO::writeRecord(Data *record) 
{ 
    this->openWrite(); 

    fstream::pos_type offset = file->tellp(); 
    file->write(reinterpret_cast<char*>(record), sizeof(Data)); 
    return (long)offset; 
} 

オフセット返さが保存され、後に取得されます。データはそのデータを持つ構造体です。

後、私は次のコードで再びその同じデータを読み取ろう:私は内容を確認したときに768と1536私が取り戻すオフセットオフ768一部を返し

Data* RecordIO::getRecord(long offset) 
{ 
    openRead(); 
    file->seekg((fstream::pos_type) offset); 
    Data data; 
    file->read(reinterpret_cast<char *>(&data), sizeof(Data)); 
    return new Data(data); 
} 

はsizeof(データ)しかし、データのうち、私は完全な不器用さを取得します。間違っていますか?私はそれらを1つずつ盗んことができるので、

for(int i = 1; i <= numOfRecords; ++i){ 
    newData.key = i; 

    newData.postcode[0] = '1' + (rand() % 8); 
    newData.postcode[1] = '0' + (rand() % 9); 
    newData.postcode[2] = '0' + (rand() % 9); 
    newData.postcode[3] = '0' + (rand() % 9); 
    newData.postcode[4] = ' '; 
    newData.postcode[5] = 'A' + (rand() % 25); 
    newData.postcode[6] = 'Z' - (rand() % 25); 
    newData.postcode[7] = '\0'; 

    for(int j = 0; j < 250; ++j){ 
     newData.info1[j] = '+'; 
     newData.info2[j] = '*'; 
     newData.info3[j] = '-'; 
    } 

    newData.info1[250] = '\0'; 
    newData.info2[250] = '\0'; 
    newData.info3[250] = '\0'; 

    int offset = file->writeRecord(&newData); 
    index->setOffset(i, offset); 
} 

ところで、データが正しく保存されている:私はそれを埋める方法を

struct Data{ 
    long key; 
    char postcode[8]; 
    char info1[251]; 
    char info2[251]; 
    char info3[251]; 
}; 

そして、これは次のとおりです。 編集:

これは構造体であります1つずつ、順番に

答えて

3

あなたはこれを行う:

file->write(reinterpret_cast<char*>(record), sizeof(Data)); 

はあなたが近いか、またはファイルをフラッシュしますか?あなたが強制しない限り、データは後でディスクに書き込まれるようにメモリにバッファリングされます。

+0

それが問題でした。今すぐ正しいデータを返します。 – Ikke

0

私たちにデータ構造の定義を教えてください。私は、DataがPOD(plain-old-data)型ではなく、より特殊化された直列化を必要とすると考えています。

編集:ありがとう。これはPOD構造体なので、これは問題ではありません。

関連する問題