理解以下C++代码有问题。(seekp)

4
#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
因为程序正在读取数据从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的数据。

非常感谢让我清楚明白了。已经清晰地理解了这个概念... :-) - ATR
@ankur.trapasiya,ASCII艺术是解决世界上所有问题的解决方案 :) - riwalk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接