所以我對此做了相當多的研究,無法讓我的輸出正常工作。 我需要從文件讀入數據並將其存儲到鏈接列表中。使用的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;
}
}
最後一次迭代添加一個無關節點,隨後將其「下一個」指針設置爲空。除了Node的這個成員之外,Node的這個實例的所有成員都是由編譯器生成的構造函數默認初始化的,也就是垃圾記錄。 – damienh
所以這是因爲我在構造函數中有它?這絕對有道理。 – Nick
爲什麼不使用std :: list? – Sebastian