#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;
}
Run Code Online (Sandbox Code Playgroud)
该程序是用turbo C++编写的,它处理将对象写入文件并将其读回以及更新已写入文件的对象.
在上面的代码中,我不明白为什么-1乘以sizeof对象来获取位置.有人请解释一下.
它的,因为你的程序是从T1读取数据,从T2读取数据,修改T2,然后写在 T2的内容.
首次打开fp2时,文件看起来像这样(^
表示文件指针的当前位置):
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
Run Code Online (Sandbox Code Playgroud)
在读取t1和t2之后,指针现在将指向t3的开头:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
Run Code Online (Sandbox Code Playgroud)
现在,为了写了 T2的数据,我们需要将文件指针移动回T2的开始.这有多远?-1 * sizeof(t2)
:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
<-----------+
|
This distance == sizeof(t2)
Run Code Online (Sandbox Code Playgroud)
从那里,你的程序运行fp2.seekp(pos,ios::cur);
.由于pos是负数,它会向后移动文件指针,并且文件保持此状态:
+-----------+-----------+-----------+-----------+
| t1 data | t2 data | t3 data | t4 data |
+-----------+-----------+-----------+-----------+
^
|
Run Code Online (Sandbox Code Playgroud)
现在你可以覆盖t2的数据了.
归档时间: |
|
查看次数: |
2004 次 |
最近记录: |