2011-10-19 60 views
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++編寫,它處理將對象寫入文件並讀取它們以及更新已寫入文件的對象。有問題了解下面的C++代碼。 (seekp)

在上面的代碼中,我不明白爲什麼-1乘以sizeof對象來獲得位置。 任何人都請解釋。

回答

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的數據。

+0

非常感謝讓我自己清楚。清楚理解這個概念... :-) – ankurtr

+0

@ ankur.trapasiya,ASCII藝術是解決所有世界問題的方法:) – riwalk

+0

ASCII ART?它是什麼 ? – ankurtr