2012-10-30 5 views
1

그래서이 연구에 대한 연구가 많이 있었고 제대로 작동하지 못했습니다. 파일에서 데이터를 읽고 링크 된 목록에 저장해야합니다. while 루프는 $$$$$의 센티넬에 도달하면 중지되어야합니다. 그런 다음 ID 번호 ([사용자 입력])로 검색하여 데이터를 표시합니다. 아직까지는 데이터를 올바르게 표시하고 바로 지금 읽고 싶습니다.C++ 연결된 목록 - 센티넬을 사용하여 파일에서 데이터 읽기

내 문제는 데이터가 $$$$$에서 멈추지 않는다는 것입니다 (심지어 "inFile.peek()! = EOF와 $$$$$을 생략 함)해도 멈추지 않습니다. 여분의 쓰레기 기록을지고.

나는 내 while 루프와 어떻게 새로운 노드를 만드는 오전 그러나 나는 그것이 다른 방법으로 동작하지 않습니다 함께 할 수있는 뭔가가 알고있다.

상관 도움이 될 것이다 알.

students.txt

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

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

이터 레이션이 불필요한 노드를 추가합니다.이 노드는 이후에 'next' 포인터가 null로 설정됩니다. 이 '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; 
    } 
}