如何防止在更新文件c ++时覆盖struct member值

时间:2013-01-16 14:10:59

标签: c++ struct binary overwrite records

假设我有一个二进制文件,一个文本文件和3个结构成员。我已经为struct member 1编写了一组数字,让我们称之为“score1”。现在,我想用struct member 2“score final”更新二进制文件。

此分数最终将计算得分1的百分比并将其写入二进制文件。现在我们将写入score2的第二组值。当我这样做时,得分1值和二进制文件中的原始得分最终值一样,现在我只有得分2,新得分最终从得分2计算。

我的代码示例:

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。但不是得分1,得分2,最终。

  2.   
  3. 我希望能够从score1添加final的结果,并从score2中加上final,并输出两个   决赛。

  4.   

现在这是一项任务,我有限制,我必须完成任务 贴近。

  

规则:从textfile中读取score1和score2。使用二进制来存储   得分1,得分2,决赛。用这三个写入单个文本文件   列。

2 个答案:

答案 0 :(得分:2)

这是不可能的。 IO流类允许您将数据附加到现有文件或截断它并从头开始重写所有文件。

在你的情况下,追加不起作用。所以你剩下的就是截断并重写文件中你想要的所有信息。

答案 1 :(得分:0)

如果您的二进制文件是struct Scores对象的简单列表,您可以实现两个非常简单的函数来修改二进制文件(如果编译错误,则不会检查错误等等。 - 自己动手)。

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));
}

您加载第一个文本文件,修改二进制文件。然后是第二个文件,再次修改并根据二进制文件的最终状态生成结果。我希望它能帮助你解决问题。