1

プログラムを作成しようとしていますが、プログラムが操作(例:検索、更新、追加)を実行しているときは、直接アクセスする必要があります。プログラムは、レコードに到達するためにすべてのレコードを順番に読み取るべきではありません。

 #include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct Student{
    int Id;
    int Money;
    int Age;
    char name[15];
};

void main(){
    Student buffer;
    ofstream BinaryFile("student", ios::binary);
    ifstream WorkerText("worker.txt");

//-------------------------------------------------------------------------------------------------------------
    while( WorkerText.good() ){                     
        WorkerText>> buffer.Age >> buffer.name >> buffer.name >> buffer.name;
        BinaryFile.write(  (char *) &buffer, sizeof(Student)  );    

    }
    BinaryFile.close();
//-------------------------------------------------------------------------------------------------------------
    ifstream ReadBinary( "student", ios::binary | ios::out );
    while( BinaryFile.good() ){                     
        ReadBinary.read((char*)&buffer,sizeof(Student));
        cout<<buffer.Age;

    }


//-------------------------------------------------------------------------------------------------------------


system("pause");
}

私はここで立ち往生しました私はこれを解決する方法を順番に読むことができませんでした

4

4 に答える 4

1

ファイルに同じサイズの構造が含まれている場合、またはインデックス テーブルを使用している場合にのみ、順次読み取りをスキップできます。

同じサイズの構造の場合:

void ReadStudent(istream &src, Student &dst)
{
    src.read(&dst, sizeof(dst));
}

void GoToStudentIndex(istream &src, size_t idx)
{
   src.seekg(idx * sizeof(Student), is.beg);
 }

上記の関数は、次のようにデータを書き込むことを前提としています。

void WriteStudent(ostream &dst, const Student &src)
{
    dst.write(&src, sizeof(src));
}
于 2013-03-16T17:47:52.873 に答える
0

順次読み取りを回避するには、次の 3 つのオプションがあります。

  1. 区切られたレコードを持ち、キーでソートして保存し、二分法を使用する
  2. 固定サイズのレコードを保持し、キーでソートして保存し、二分法を使用します
  3. データ ファイルよりもはるかに小さいサイズの別のインデックス ファイル (キー => データ ファイル内のオフセット) を用意し、最初にそれをプリロードして、オフセットによる直接読み取りに使用します。
于 2013-03-16T17:55:05.393 に答える
0

入力用に学生ファイルを開くときに、「アウト」モードを使用しています。

ifstream ReadBinary( "student", ios::binary | ios::out );  
^^^^^^^^                                      ^^^^^^^

これを試して:

ifstream ReadBinary("student", ios::binary);  

コンストラクターはifstream既にファイルを入力モード ( ios::in) で開いています。

于 2013-03-16T17:39:47.113 に答える
0

検索(およびその後の更新)を行いたいが、レコードをフラットファイルに順番に保存する場合、目的のレコードに直接アクセスできるようにするために、外部インデックスが必要です。この場合、学生を名前で検索してからレコードを更新したいとします。次のようなことができます。

// Store in map name and the position of record
std::map name2offset;

void writeRecord(const Student& student)
{
    name2offset[string(student.name)]=BinaryFile.tellp();
    BinaryFile.write(reinterpret_cast<char*>(&student), sizeof(Student));
}

// Return true if updated successfully else false.
bool update(const string& name, Student &newRecord)
{
    std::map<char,long>::iterator itr = name2offset.find(name);
    if (itr != name2offset.end()) {
        BinaryFile.seekp(itr->second);
        BinaryFile.write(reinterpret_cast<char*>(&newRecord), sizeof(Student));

        return true;
    }

    return false;
}

これらはすべて、構造体が固定サイズのものであることを前提としています(これはあなたの例にあります)。

于 2013-03-16T18:23:58.327 に答える