Как предотвратить перезапись значения члена структуры при обновлении файла С++

Допустим, у меня есть двоичный файл, текстовый файл и 3 члена структуры. Я уже написал набор чисел для члена структуры 1, давайте назовем его "score1". Теперь я хочу обновить двоичный файл с элементом структуры 2, "окончательная оценка".

Этот окончательный счет, например, рассчитает процентное значение score1 и запишет его в двоичный файл. Теперь мы запишем второй набор значений для score2. Когда я это делаю, значения 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

И я выведу структуры 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. Я хочу иметь возможность складывать результат финала из score1 и суммировать с финалом из score2 и выводить сложение двух финалов.

Теперь, когда это задание, у меня есть ограничения, задачи, которых я должен придерживаться.

Правила: Читать в score1 и score2 из текстового файла. Используйте двоичный файл для хранения score1, score2, final. Запишите в один текстовый файл с этими тремя столбцами.


person TL Han    schedule 16.01.2013    source источник
comment
Значит, вам нельзя одновременно иметь в памяти score1 и score2?   -  person SvenS    schedule 16.01.2013
comment
Я, я просто не знаю, как использовать написать код. Пока ничего из того, что я пробовал, не работает.   -  person TL Han    schedule 16.01.2013


Ответы (2)


Это невозможно. Классы потока ввода-вывода позволяют либо добавлять данные в существующий файл, либо обрезать его и перезаписывать все с самого начала.

В вашем случае добавить не получится. Итак, что вам осталось, так это обрезать и переписать всю информацию, которую вы хотите в файле.

person Nawaz    schedule 16.01.2013
comment
Нет ли способа сделать это, игнорируя мои ограничения на секунду. Да, мое намерение состоит в том, чтобы переписать выходной текстовый файл из членов структуры, как только у меня будет счет1 и счет2. Я не уверен, что вы это имели в виду. - person TL Han; 16.01.2013

Если ваш бинарный файл представляет собой простой список объектов 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));
}

Вы загружаете первый текстовый файл, изменяете двоичный файл. Затем второй файл, еще раз модифицируя и генерируя результат на основе конечного состояния двоичного файла. Я надеюсь, что это поможет вам решить проблему.

person Przemysław Lenart    schedule 16.01.2013
comment
Это похоже на код, который у меня есть. Если я использую seekp перед записью, все мои значения в конечном текстовом файле будут отображать только последнее значение, которое я взял из текстового файла. - person TL Han; 16.01.2013