Возникли проблемы с пониманием следующего кода C ++.(Seekp) - PullRequest
4 голосов
/ 20 октября 2011
#include<stdio.h>
#include<fstream.h>
class Test
{
    char name[10];
    int data;
    public:
        void getData()
        {
            cin>>name;
            cin>>data;
        }
        void display()
        {
            cout<<name<<data;
        }
        void modify()
        {
            cin>>name;
            cin>>data;
        }
};
int main()
{
    Test t1,t2,t3,t4;
//  remove("FileIO.dat");
    t1.getData();
    t2.getData();
    t3.getData();
    t4.getData();
    fstream fp1("FileIO.dat",ios::out|ios::app);
    fp1.write((char*)&t1,sizeof(t1));
    fp1.write((char*)&t2,sizeof(t2));
    fp1.write((char*)&t3,sizeof(t3));
    fp1.write((char*)&t4,sizeof(t4));
    fp1.close();
    fstream fp2("FileIO.dat",ios::in|ios::out);
    fp2.read((char*)&t1,sizeof(t1));
    fp2.read((char*)&t2,sizeof(t2));
    int pos=-1*sizeof(t2); // ****** not understanding this line
    cout<<pos;
    fp2.seekp(pos,ios::cur);
    t2.modify();
    fp2.write((char*)&t2,sizeof(t2));
    fp2.read((char*)&t3,sizeof(t3));
    fp2.read((char*)&t4,sizeof(t4));
    t1.display();
    t2.display();
    t3.display();
    t4.display();
    fp2.close();
    return 0;
}

Программа написана на Turbo C ++ и занимается записью объектов в файлы и их чтением, а также обновлением объекта, записанного в файл.

В приведенном выше коде я не понимаю, почему -1 умножается на размер объекта, чтобы получить позицию. Кто-нибудь, пожалуйста, объясните.

1 Ответ

7 голосов
/ 20 октября 2011

Это потому, что ваша программа читает данные из 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.

...