【问题标题】:Having problem understanding following C++ code. (seekp)在理解 C++ 代码后有问题。 (寻找)
【发布时间】:2026-02-16 09:50:01
【问题描述】:
#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 乘以 sizeof 对象来获得位置。 请哪位大神解释一下。

【问题讨论】:

    标签: c++ file-handling


    【解决方案1】:

    这是因为你的程序正在从 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 的数据了。

    【讨论】:

    • 非常感谢您让自己清楚。清楚地理解了这个概念...... :-)
    • @ankur.trapasiya,ASCII 艺术是解决世界上所有问题的方法:)