0

バイナリ ファイル、テキスト ファイル、および 3 つの構造体メンバーがあるとします。構造体メンバー 1 の一連の数値を既に書きましたが、これを「score1」と呼びましょう。ここで、バイナリ ファイルを構造体メンバー 2 の "score final" で更新します。

この最終的なスコアは、たとえば、score1 のパーセンテージを計算し、それをバイナリ ファイルに書き込みます。次に、score2 の 2 番目の値セットを書き込みます。これを行うと、score1 の値とバイナリ ファイルからの元のスコアの最終値がなくなり、現在はスコア 2 と、score2 から計算された新しいスコアの最終値しかありません。

私のコードのサンプル:

struct Scores{
float score1;
float score2;
float final;
};

fstream afile;
fstream afile2;

//afile will read in sets of score1 values from text file

//afile2 will output sets of score1 values to binary file
//while final is also outputted.

//Then, afile will again read in sets different of score2 values from text file
//afile 2 will output sets of score1 values to binary file 
//and final is also outputted but with new calculations

読み込まれるテキスト ファイルは次のようになります。

12.2
41.2
51.5
56.2
9.2

and the second text file:
76.1
5.7
62.3
52.7
2.2

そして、struct score1 と score2 と final を次のようなテキスト ファイルに出力します。

Final   Score1   Score2 
       12.2      76.1
       41.2      5.7
       51.5      62.3
       56.2      52.7
       9.2       2.2 

最後の列は空ですが、私の言いたいことはわかります。

今問題:

  1. それをテキストファイルに出力するたびに、最終列、スコア1、または最終列スコア2のみを実行できます。ただし、score1、score2、final ではありません。

  2. 私は、score1 から決勝の結果を加算し、score2 から決勝を加算して、2 つの決勝の加算を出力できるようにしたいと考えています。

これは割り当てであるため、私には制限があり、細心の注意を払わなければならないタスクがあります。

ルール: テキストファイルからスコア 1 とスコア 2 を読み込みます。バイナリを使用して、score1、score2、および final を格納します。これら 3 つの列を含む 1 つのテキスト ファイルに書き込みます。

4

2 に答える 2

2

それは不可能です。IO ストリーム クラスを使用すると、既存のファイルにデータを追加するか、データを切り捨てて最初からすべてを書き直すことができます。

あなたの場合、追加は機能しません。したがって、残っているのは、ファイルに必要なすべての情報を切り捨てて書き直すことです。

于 2013-01-16T14:16:05.633 に答える
0

バイナリ ファイルが struct Scores オブジェクトの単純なリストである場合、バイナリを変更するための 2 つの非常に単純な関数を実装できます (エラーをチェックしない、コンパイルする場合など - 自分で行う)。

Scores readScores(std::ifstream& file, unsigned int scoresNum)
{
    Scores scores;
    file.seekg(scoresNum*sizeof(Scores), std::ios_base::beg);
    file.read(static_cast<char*>(&scores),sizeof(Scores));
    return scores;
}

void writeScores(std::ofstream& file, unsigned int scoresNum, const Scores& scores)
{
    file.seekp(scoresNum*sizeof(Scores), std::ios_base::beg);
    file.write(static_cast<char*>(&scores),sizeof(Scores));
}

最初のテキスト ファイルを読み込み、バイナリを変更します。次に、2 番目のファイルをもう一度変更し、バイナリ ファイルの最終状態に基づいて結果を生成します。問題の解決に役立つことを願っています。

于 2013-01-16T16:10:26.410 に答える