Это потому, что ваша программа читает данные из t1, читает данные из t2, изменяет t2, а затем записывает через содержимое t2.
Когда fp2 впервые открываетсяфайл выглядит следующим образом (^
представляет текущую позицию указателя файла):
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
После считывания t1 и t2 указатель теперь будет указывать на начало t3:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
Теперь, чтобы записать поверх данных t2, нам нужно переместить указатель файла обратно в начало t2.Как далеко это?-1 * sizeof(t2)
:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
<-----------+
|
This distance == sizeof(t2)
Оттуда ваша программа запускает fp2.seekp(pos,ios::cur);
.Так как pos отрицателен, он перемещает указатель файла назад, и ваш файл остается в таком состоянии:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
И теперь вы можете перезаписать данные t2.