2016-01-18 27 views
-4

我正在開發一個項目,我必須實現一個異類列表的隊列和堆棧。我執行這個列表,但是當我嘗試將信息放入它時,有些事情會出錯。我必須從文件中讀取信息並將這些信息放入列表中;該列表由n個容器組成。文件中的每一行(類似stack 1 2 4 5)都是異構列表中的容器,其中第一個字符串顯示容器是堆棧還是隊列。我嘗試讀取信息並將其放入列表中,但它只讀取第一行。從文件中讀取並放入一個容器C++

這裏是我的代碼:

void write_in_txt(int n){ 
ofstream foo("conteiners.txt"); 
string type; 
for(int i=0;i<n;i++){ 
    cin>>type; 
    foo << type; 
    int num = 1; 
    while(num != 0){ 
     cin>>num; 
    if(num!=0){ 
     foo<<" "; 
     foo<<num; } 
    } 
    foo << endl; 
    } 
} 

void read_and_make(int n,QueueStackList& qsl){ 
    ifstream data("conteiners.txt"); 
    string tmp; 
    LinkedListIterator<Object<int>*> it; 
    for(int i=0;i<n;i++){ 
    if(i == 0){ 
    int temp; 
    data >> tmp; 
    if(tmp.compare("stack")){ 
     qsl.insertEnd(new StackObject<int>); 
     it = qsl.begin(); 
     while(data >> temp){ 
     (*it)->insert(temp); 
     } 
    } 
    else 
     { 
     qsl.insertEnd(new QueueObject<int>); 
     it = qsl.begin(); 
     while(data >> temp){ 
      (*it)->insert(temp); 
     } 
    } 
    } 
    else { 
     int temp; 
    data >> tmp; 
    if(tmp.compare("stack")){ 
     qsl.insertEnd(new StackObject<int>); 
     it++; 
     while(data >> temp){ 
     (*it)->insert(temp); 
     } 
    } 
    else 
     { 
     qsl.insertEnd(new QueueObject<int>); 
     it++; 
     while(data >> temp){ 
      (*it)->insert(temp); 
     } 
    } 

    } 
    } 
} 

containers.txt:

stack 4 7 4 7 7 
stack 9 8 7 4 
queue 1 2 5 3 
stack 8 7 7 7 

和主要功能:

int main(){ 
QueueStackList qsl; 
//write_in_txt(4); 
read_and_make(4, qsl); 

cout << qsl <<endl; ///prints only 4 7 4 7 7 
return 0; 
} 
+5

這聽起來像你可能需要學習如何使用調試器來遍歷你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

如果您創建了自己的代碼,則代碼更簡單首先堆疊或排隊,填充數據,然後插入到列表中。 –

回答

0

的問題是在這裏:

while(data >> temp){ 
    ... 
} 

該操作不會停止在行末,但會繼續到下一行,並嘗試將「堆棧」讀入整數變量,這會將data置爲fail狀態。

有幾種方法可以解決這個問題。您可以更改containers.txt的格式,並添加一個前導數字,指示該行中有多少個數字。或者你可以用getline來讀取整行,然後解析它(「手工」或stringstream)。或者你可以嘗試清除fail狀態,恢復單詞「堆棧」並繼續(我不知道如何做到這一點)。

相關問題