2

私のラボ作業では、txtからデータを読み取り、バイナリ形式で.datファイルに書き込む必要があります。次に、バイナリファイル内の指定されたIDでデータを検索して見つける必要があります。この中の私たちのworker.txtファイル

フォーマット:

ID firstname lastname age salary

お気に入り:

341 Alex Morgan 32 3400
234 Jessica Gibson 28 2000
...

プログラムはこれらのデータを読み取り、それらすべてをバイナリファイルとしてworker.datに書き込みます。

問題は、プログラムを検索するための有効なIDを入力すると、それを見つけて印刷しますが、Windowsが実行停止エラーで閉じた場合、それを処理するためにあなたの助けが必要です。

私のsearchByID関​​数:

void searchByID( int key )
{
bool find=false;
int id,age,sal;
string fn,ln;
ifstream InFile;
InFile.open("worker.dat", ios::in | ios::binary);
int i = getSize( initialArr );
int j;
for( j=0; j<i; j++ ){
    InFile.read( (char*)&id, sizeof(int));
    InFile.read( (char*)&fn, sizeof(string));
    InFile.read( (char*)&ln, sizeof(string));
    InFile.read( (char*)&age, sizeof(int));
    InFile.read( (char*)&sal, sizeof(int));
    if( id == key )
    {
        cout << "Datas for Entered ID:\n"
            << id <<" "<< fn <<" "
            << ln <<" "<< age <<" "
            << sal << endl;
        find = true;
    }
}
if( !find )
    cout << "Entered ID not Found on File" << endl;
InFile.close();
}
4

2 に答える 2

2

このようなことをしてもうまくいきません:

InFile.read( (char*)&fn, sizeof(string));

通常、文字列には実際の文字へのポインターが内部的に含まれているため、実際のテキストはファイルのどこにも保存されません。代わりに、char 配列を使用して文字列を読み書きする必要があります。

于 2013-03-10T15:25:31.483 に答える
1

コメントで述べたように、ここには多くの問題があるようです。worker.txt の形式を説明し、worker.dat というファイルから読み取っています。それらは同じ形式ですか?そうでない場合は、テキスト ファイルを読んでいます。その場合、文字列の長さはわかりませんが、null で終了していると思います。

これが問題の 1 つの例です。 sizeof(string) は、読み取り中の文字列の長さではなく、常にポインターのサイズになります。

これがテキスト ファイルの場合は、次のようにします。

  • テキスト ファイルから 1 行を読み取ります。

  • その行を解析する

于 2013-03-10T15:26:28.487 に答える