2012-10-30 74 views
1

所以我對此做了相當多的研究,無法讓我的輸出正常工作。 我需要從文件讀入數據並將其存儲到鏈接列表中。使用的while循環應該在它碰到$$$$$ sentinel時停止。然後我要顯示數據(通過ID號[用戶輸入]搜索)我還沒有那麼遠,但我只是想正確顯示數據並立即讀入數據。C++鏈接列表 - 從帶有標記的文件中讀取數據

我的問題是當它顯示的數據是不是在$$$$$停止(即使我做「inFile.peek()!= EOF並省略$$$$$)我仍然獲得一個額外的垃圾紀錄。

我知道它是與我的while循環,以及如何我創建一個新的節點,但我不能讓它開始工作任何其他方式。

任何幫助將是讚賞。

students.txt

Nick J Cooley 
324123 
60 
70 
80 
90 
Jay M Hill 
412254 
70 
80 
90 
100 
$$$$$ 

assign6.h文件

#pragma once 
#include <iostream> 
#include <string> 
using namespace std; 
class assign6 
{ 
public: 
    assign6(); // constructor 
    void displayStudents(); 


private: 
struct Node 
{ string firstName; 
    string midIni;  
    string lastName; 
    int idNum; 
    int sco1; //Test score 1 
    int sco2; //Test score 2 
    int sco3; //Test score 3 
    int sco4; //Test score 4 
    Node *next; 
}; 
Node *head; 
Node *headPtr; 


}; 

assign6Imp.cpp //實現文件

#include "assign6.h" 
#include <fstream> 
#include <iostream> 
#include <string> 
using namespace std; 

assign6::assign6() //constructor 
{ 

ifstream inFile; 
inFile.open("students.txt"); 

head = NULL; 
head = new Node; 
headPtr = head; 
while (inFile.peek() != EOF) //reading in from file and storing in linked list 
{ 

    inFile >> head->firstName >> head->midIni >> head->lastName; 
    inFile >> head->idNum; 
    inFile >> head->sco1; 
    inFile >> head->sco2; 
    inFile >> head->sco3; 
    inFile >> head->sco4; 

    if (inFile != "$$$$$") 
    { 
    head->next = NULL; 
    head->next = new Node; 
    head = head->next; 
    } 
} 

head->next = NULL; 

inFile.close(); 
} 

void assign6::displayStudents() 
{ 
int average = 0; 
for (Node *cur = headPtr; cur != NULL; cur = cur->next) 
{ 
    cout << cur->firstName << " " << cur->midIni << " " << cur->lastName << endl; 
    cout << cur->idNum << endl; 
    average = (cur->sco1 + cur->sco2 + cur->sco3 + cur->sco4)/4; 
    cout << cur->sco1 << " " << cur->sco2 << " " << cur->sco3 << " " << cur->sco4 << " " << "average: " << average << endl; 
} 
} 
+3

最後一次迭代添加一個無關節點,隨後將其「下一個」指針設置爲空。除了Node的這個成員之外,Node的這個實例的所有成員都是由編譯器生成的構造函數默認初始化的,也就是垃圾記錄。 – damienh

+0

所以這是因爲我在構造函數中有它?這絕對有道理。 – Nick

+2

爲什麼不使用std :: list? – Sebastian

回答

0

這可不行:

if (inFile != "$$$$$") 

你不能比較流「$$$ $$」。您只能從流中讀取一個字符串,並將其與「$$$$$」進行比較。

1

也許你應該嘗試逐行閱讀,就像這樣。

const string END_OF_FILE_DELIM = "$$$$$"; 
ifstream inFile("students.txt"); 
string line; 
while(getline(inFile,line)){ 
    cout << "line = " << line << endl; 
    if(line == END_OF_FILE_DELIM){ 
     break; 
    } 
    else{ 
     //create new Node with value = line; 
    } 
}