gpt4 book ai didi

c++ - 理解以下 C++ 代码时遇到问题。 (寻求)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:36 30 4
gpt4 key购买 nike

#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 对象来获得位置。任何人请解释。

最佳答案

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

关于c++ - 理解以下 C++ 代码时遇到问题。 (寻求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829094/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com