2016-03-22 15 views
-3

私はファイルを使ってプロジェクトを進めています。 プロジェクトのパート1は、いくつかのオブジェクトをテキストファイルに追加/削除してソートすることでしたので、すでにこれらの関数を実装しています。 パート2は、バイナリファイルの追加/削除とソートを行う手段です。 私の考えは、バイナリファイルをテキストファイルに変換する "マジック関数"を持っていることです。上記の関数を使うよりも(テキストファイルだけをサポートしているので)何でもお願いします - add obejcts;テキストファイルからバイナリファイルへの "魔法の機能"で再び変換するよりも。 テキストファイル内のすべての行は、「候補者」と呼ばれるオブジェクトです。文字列ID、文字列名、文字列パーティ たとえば、最初の行は次のようになります。 201、Drumd、Trump、Republican この「マジック機能」はどこにありますか? ありがとうございました。バイナリからテキストへのファイルとバイナリへのテキストファイル

+0

Googleで「base64 encoding」を検索してください。 –

+0

私はそれが要件の精神にあるとは思わない。バイナリファイルを使用する理由は、オブジェクトの追加や削除が容易になるためです。 –

+0

@MartinBroadhurstだから何をお勧めしますか? –

答えて

0

の意味はの意味を知る必要があるため、特にバイナリデータの場合は明確ではないため、テキストとバイナリデータの間で変換する一般的な方法はありません。

あなたのクラスは既にあなたのデータが意味するものを知っているので、あなたのクラスだけがテキストとして自らを読み込み、それ自身をバイナリとして書くことができます。しかし、あなたのクラスでテキストやバイナリとして読み書きを実装すると、変換の必要性はなくなります。

私は、あなたのクラスでテキストやバイナリとして読み書きを実装することが、最初にやってみたいことであると確信しています。

クラスにはstd::stringが含まれています。そこバイナリとしてそれらを書くの標準的な方法はありませんが、一つの方法は、第1の長さを書き込み、その後、コンテンツを作成することです:

void WriteString(const std::string& s, std::ofstream& os) 
{ 
    size_t size = s.size(); 
    os.write(reinterpret_cast<char*>(&size), sizeof(size_t)); 
    os.write(s.c_str(), size); 
} 

読書の逆のプロセスは、コンテンツを第1の長さを読み取り、意味します。あなたはまっすぐにそのメモリ・バッファが連続することが保証されていないためstd::stringにコンテンツを読み取ることができないので、あなたは、仲介者としてstd::vector<char>を使用する必要があります。今すぐ

std::string ReadString(std::ifstream& is) 
{ 
    size_t size; 
    is.read(reinterpret_cast<char*>(&size), sizeof(size_t)); 
    std::vector<char> buffer(size); 
    is.read(&buffer[0], size); 
    return std::string(&buffer[0], size); 
} 

書いたりなど、あなたのCandidateオブジェクトを読み取るためにバイナリ、あなただけの時間で、フィールド1を書き込みまたは読み取りするには、これらの二つの機能を使用する必要があります。

void Candidate::Write(std::ofstream& os) const 
{ 
    WriteString(id, os); 
    WriteString(name, os); 
    WriteString(last_name, os); 
    WriteString(party, os); 
} 

void Candidate::Read(std::ifstream& is) 
{ 
    id = ReadString(is); 
    name = ReadString(is); 
    last_name = ReadString(is); 
    party = ReadString(is); 
} 

あなたが読書のための「空」のオブジェクトを作成するためにあなたのCandidateクラスのデフォルトコンストラクタが必要になります、そして必要になりますおそらく候補者の数をあなたは何回読み返すべきかを知っています。

バイナリファイルにはこれより多くのものがあります。実際には、ランダムアクセスを実装してメリットを得たいと思うかもしれませんが、これで起動するはずです。

関連する問題