2015-12-12 95 views
0

我寫了一個程序,只輸出單鏈表,它工作得很好,但它是兩次輸出的最後一個字符(例如,如果要輸出的字是它輸出DADD DAD)單鏈表輸出額外的字符

#include <iostream> 
 
#include <fstream> 
 
using namespace std; 
 
ifstream infile; 
 
struct nodeType 
 
{ 
 
\t char num; 
 
\t nodeType *next; 
 
}; 
 
int main() 
 
{ 
 
\t infile.open("TextFile2.txt"); 
 
\t if (!infile) 
 
\t \t cout << "Cannot open the file." << endl; 
 
\t char digit; 
 
\t nodeType *head = NULL, *trail = NULL, *current = NULL; 
 
\t while (!infile.eof()) 
 
\t { 
 
\t \t infile >> digit; 
 
\t \t if (head == NULL) 
 
\t \t { 
 
\t \t \t head = new nodeType; 
 
\t \t \t head->num = digit; 
 
\t \t \t head->next = NULL; 
 
\t \t \t trail = head; 
 
\t \t } 
 
\t \t else 
 
\t \t { 
 
\t \t \t current = new nodeType; 
 
\t \t \t current->num = digit; 
 
\t \t \t current->next = NULL; 
 
\t \t \t trail->next = current; 
 
\t \t \t trail = current; 
 
\t \t } 
 

 
\t } 
 
\t current = head; 
 
\t while (current != NULL) 
 
\t { 
 
\t \t cout << current->num; 
 
\t \t current = current->next; 
 
\t } 
 
}

回答

1
while (!infile.eof()) 
{ 
    infile >> digit; 

這是問題所在。 EOF位僅在操作試圖讀取以讀取流的末尾並失敗時設置。

在您的示例中,代碼讀取最後一個D,因爲它讀取單個字符,但它尚未遇到流結束,因此循環條件仍然爲真。然後它嘗試讀取,發現流中沒有字符,失敗,設置eof和失敗位,但是爲時已晚。循環體的其餘部分被執行,在digit的任何值上運行。總之:eof在循環條件下幾乎總是錯的

優選的方法是環上的輸入操作:

while (infile >> digit) 
{