2012-03-25 31 views
-5

在這個函數中,我試圖從鏈表中的信息寫入到文件我怎樣寫鏈表作爲一個對象到一個文件

class Employer: public People{ 

      void tryWrite(){ 

       ofstream file("Employer.dat",ios::out|ios::app| ios::binary); 


       if(file.is_open()){ 


        file<<getFirstName()<<" "<<getLastName()<<" " << companyName<<" "<<position<<" "<<getTelHome()<<" "<<getTelMobile()<<" " <<email<<" "<<getAddress()<< endl; 

        file.close(); 
       } 

      } 


    }; 
    #endif 

這是僱主類

鏈表操縱

在WriteFile函數我試圖通過鏈接列表遍歷並調用Employer.h的tryWrite函數寫在鏈接列表的實際數據保存到文件這一點

class EmployerList 
    { 
    private: 

     Employer *head;//employee pointer(head pointer) 

    public:  

    void writeFile(){ 

    Employer *temp = head; 
     while (temp != NULL) 
     { 

      temp->tryWrite();//Employee's display method called here 
      temp = temp->getNext(); 
     } 


    } 

在此閱讀功能中,我想按以下順序讀取數據姓名:Jane Brown公司名稱:Lime職位:店員地址: New Kingston首頁#:876-466-8778手機號碼:543-455-6344電子郵件: [email protected]

而是直接從文件中讀取數據,珍妮·布朗石灰店員 新金士頓876-466-8778 543-455-6344 [email protected]

當它到達的地址它會顯示爲:地址:新

而不是:地址:New Kingston

T他零空間中創造的問題,我不知道如何得到它 做我想做什麼

無效TestRead(){

ifstream tryRead("em.dat", ios::in|ios::binary); 


    string Email, cName, pos,fName,lName,addr, tHome,tMobile; 


    while(tryRead>>fName>>lName>>cName>>pos>>addr>>tHome>>tMobile){ 

     cout<<"Name: "<<fName<<lName<<endl; 
     cout<<"Comapny's Name: "<<cName<<endl; 
     cout<<"Position: "<<pos<<endl; 
     cout<<"Address: "<<addr<<endl; 
     cout<<"Home#: "<<tHome<<endl; 
     cout<<"Mobile#: "<<tMobile<<endl; 

         tryRead.close(); 
    } 


} 


}; 
     #endif 

這是主要的,其填充數據

鏈表鏈表中填充數據
#include <iostream> 
    #include <string> 
    #include "Employer.h" 
    #include "EmployerList.h" 

    using namespace std; 

    void main() 
    { 

     EmployerList em; 

     em.AddNode("[email protected]", "LIME", "Manager", "Tashauna", "Simon", "New Kingston", "876-985-8337", "876-405-3536"); 

     em.AddNode("[email protected]", "NOKIA", "CEO", "Keric", "McDonald", "Europe", "0411-789-6548", "985-257-1111"); 

經過EmployerList.h寫文件函數被調用

 em.writeFile(); 

    em.TestRead(); 




     system("pause"); 

    } 
+0

這是很難幫助你,如果你必須通過所有的代碼閱讀。不要發佈超過必要的代碼。 – 2012-03-25 08:27:45

+0

@ Zyx2000我拿出不必要的代碼 – 2012-03-25 09:40:30

+0

您是否從電子郵件複製並粘貼您的問題?你爲什麼要把文字放在文字的前面?它導致文字顯示爲「引號」的【如何寫一個鏈表對象文件] – 2012-03-29 04:22:58

回答

5

我沒有讀你的代碼,因爲它不相關。問題在於標題,這就是我正在回答的問題。

將鏈接列表寫入文件意味着將鏈接列表的每個成員寫入文件。鏈接列表是指向下一個對象的一系列對象,當您想將其轉儲到文件中時 - 您只需將這些對象逐一轉儲。

當你需要重建你的鏈表時 - 你從文件中讀取每個對象,並以相同的順序將它鏈接到一個新的鏈表中(如果你保存了FIFO - 確保重建它,而不是反向) 。不用說,你不應該保存指針並從文件中讀取它們。

如果問題是關於大量代碼中的某些內容 - 您必須改進問題並儘量減少代碼。

編輯

您慈祥提到後真正的問題是什麼 - 然後在tryWrite你一遍又一遍地打開相同的文件再次,覆蓋任何在那裏以前。很顯然,它將最終從列表中留下最後一個對象,因爲之前的所有對象都將被覆蓋。

您應該使用ios::out | ios::in | ios::ateios::out | ios::app,尋求到現有數據的末尾並添加,而不僅僅是ios::out

+0

是的,問題出現在代碼中,當我發佈以前的觀衆抱怨說我的代碼不會運行,我應該發佈整個代碼。問題是EmloyerList.h中的writeFile和Employer.h中的tryWrite函數。我想知道如何將每個鏈表寫入文件 – 2012-03-25 08:30:10

+0

@TT你每次都覆蓋你的文件。修復它,你會很好。 – littleadv 2012-03-25 08:35:49

+0

@liitleadv我編輯了代碼,只包括給我麻煩的東西。再次審查它,看看它是否更清晰 – 2012-03-25 08:36:37

2

至於我可以不轉錄,編譯和運行代碼告訴,沒有什麼根本性的錯誤了。我會從tryWrite()函數中提取出ofstream,在writeFile()中將其打開一次,並將其作爲參數傳入,而不是打開和關閉鏈接列表中每個節點的文件。

你可能有一些問題,閱讀的鏈表回,因爲你似乎沒有做任何事情來掃描數據非法字符。您正在使用空格字符作爲分隔符,因此您應該小心確保您保存到文件的任何字段都先被轉義(即用某種轉義序列替換任何空格字符)。否則,在重新閱讀事物時,任性的空間可能會讓事情變得糟糕。

爲了將來的參考,如果你的代碼存在問題,而不是隻列出所有的代碼並詢問它有什麼問題,你應該儘量至少描述你遇到的問題 - 什麼是輸出,在代碼中你認爲你正在做的事情錯了,等

+0

+1尤其是最後一段...很大的反響。 – littleadv 2012-03-25 08:57:07

+0

@EdJ是的,你是對的,當我嘗試從我確實有問題,例如讀取該文件我想這應該是「新的金士頓」當我從文件中讀取的地址的所有我得到的回覆是「新」的地址,而不是「新金斯頓」。 – 2012-03-25 09:06:47

相關問題