2013-09-24 140 views
0

程序創建兩個文件emp.txt和sal.txt,這兩個文件的內容最後放在empdetails.txt中,一切正常,但顯示功能: - void display()顯示最後一個記錄TWICE.Why最後一個記錄顯示兩次?將兩個文件合併成一個在C++中並顯示它的內容

#include<iostream> 
#include<conio.h> 
#include<fstream> 
using namespace std; 

class emp 
{ 
     int num,age; 
     char name[20],dep[5]; 

     public: 
      void getdata() 
      { 
      cout<<"\n\n Name = "; 
      cin>>name; 
      cout<<"\n Emp Num = "; 
      cin>>num; 
      cout<<"\n Department= "; 
      cin>>dep; 
      cout<<"\n Age  = "; 
      cin>>age; 
      } 
      void display1() 
      { 
      cout<<"\n"<<name<<"\t"<<num<<"\t"<<dep<<"\t\t"<<age; 
      } 

}; 

class sal 
{ 
     float gs,ns; 
     public: 
      void getsal() 
      { 
      cout<<"\n Gross sal = "; 
      cin>>gs; 
      cout<<"\n Net sal = "; 
      cin>>ns; 
      } 
      void display2() 
      { 
      cout<<"\t"<<gs<<"\t"<<ns; 
      }   
}; 

void display() 
{ 
    emp e;sal s; 
    ifstream fil1; 

    fil1.open("empdetails.txt",ios::in); 

    cout<<"\n\n Name \t Emp Num \t Dep \t Age \t Gross Sal \t Net Sal \n"; 

    while(!fil1.eof()) 
    { 
    fil1.read((char*)&e,sizeof(e)); 
    e.display1(); 

    fil1.read((char*)&s,sizeof(s)); 
    s.display2(); 
    } 
} 

int main() 
{ 
    int n; 
    emp e1;sal s1; 
    ofstream fil1,fil2,fil3; 

    fil1.open("emp.txt",ios::out); 
    fil2.open("sal.txt",ios::out); 
    fil3.open("empdetails.txt",ios::out); 

    cout<<"\n How many employee details do you want to enter = "; 
    cin>>n; 

    cout<<"\n Enter the deatils one by one \n"; 
    for(int i=0;i<n;i++) 
    { 
     e1.getdata(); 
     fil1.write((char*)&e1,sizeof(e1)); 

     s1.getsal(); 
     fil2.write((char*)&s1,sizeof(s1)); 

     fil3.write((char*)&e1,sizeof(e1)); 
     fil3.write((char*)&s1,sizeof(s1)); 
    } 
    fil1.close(); 
    fil2.close(); 
    fil3.close(); 

    cout<<"\n\n\t\t Merged file contents \n\n\t\t"; 
    display(); 
    getch(); 
    return 0; 
} 

回答

0

,當你閱讀BEYOND的最後一個字符的EOF狀態設置。 所以你應該檢查一下read()

while(true) 
    { 
    fil1.read((char*)&e,sizeof(e)); 
    // do the checking right after a read() 
    if (fil1.eof()) 
     break; 
    e.display1(); 

    fil1.read((char*)&s,sizeof(s)); 
    s.display2(); 
    } 
0

不要使用file1.eof

請參閱其他崗位數百個答案已經存在。

例子:this

修正像follwing:

while(fil1.read((char*)&e,sizeof(e))) 
    { 
    //fil1.read((char*)&e,sizeof(e)); 
    e.display1(); 

    fil1.read((char*)&s,sizeof(s)); 
    s.display2(); 
    } 

或者

如果你仍然想使用eof: -

while(true) 
    { 
    fil1.read((char*)&e,sizeof(e)); 
    if (fil1.eof()) //Check here after reading 
     break; 
    e.display1(); 

    fil1.read((char*)&s,sizeof(s)); 
    s.display2(); 
    } 
相關問題