理解以下c++代码有困难.(seekp)
Having problem understanding following C++ code. (seekp)
#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++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 理解以下c++代码有困难.(seekp)