2014-02-12 35 views
0

我輸入查詢文件(input.txt中)到我的程序 input.txt中包含了這樣的文字:正從文件輸入怪異符號

Trojans, 0.80, 0.60 
Bruins, 0.20, 0.30 
Bears, 0.60, 0.50 
Trees, 0.50, 0.40 
Ducks, 0.40, 0.80 
Beavers, 0.50, 0.10 
Huskies, 0.80, 0.40 
Cougars, 0.10, 0.90 

但什麼終端outputed是

Trojans, 0.80, 0.60 
Bruins, 0.20, 0.30 
Bears, 0.60, 0.50 
Trees, 0.50, 0.40 
Ducks, 0.40, 0.80 
Beavers, 0.50, 0.10 
Huskies, 0.80, 0.40 
Cougars, 0.10, 0.90� 

我不確定奇怪的問號來自哪裏。

我的代碼目前是

任何想法爲什麼可能是這種情況?

+0

什麼是「團隊」? –

+0

我的不好使編輯 – user3298889

+0

ifstream_obj.get()一次獲取一個字符,你正在存儲在一個字符數組中。這個數組會像C舊數組一樣查看C++,因此應該以null結尾。另外,你的輸入緩衝區(團隊)不夠大;你正在運行數組的末尾,並調用未定義的行爲。 – DavidO

回答

0

EOF()告訴你你是否已經嘗試讀取文件末尾,所以你的循環不正確。它應該是:

for (;;) 
{ 
    temp = myfile.get(); 
    if (myfile.eof()) break; 
    team[il] = temp; 
    il++; 
} 
+0

這個作品謝謝你閱讀的巨大問題! – user3298889

0

最後的字符是一些垃圾值。因爲il在while循環中增加,即使它在EOF中也是如此。下面的改變應該糾正這個問題。檢查變化的條件東東<(IL-1)

for (int nee = 0; nee < (il - 1); nee++) //check to see if what i outputted is correct 
    { 
     cout << team[nee]; 
    } 

檢查以下修改ReadFile的例行:

void readfile() 
    { 
     char temp; 
     ifstream myfile ("input.txt"); 
     int il = 0; 
     while (!myfile.eof()) 
     { 
      temp = myfile.get(); 
      team[il] = temp; 
      il++; 
     } 
     for (int nee = 0; nee < il - 1; nee++) //check to see if what i outputted is correct 
     { 
      cout << team[nee]; 
     } 
     cout << endl ; 
    } 
+0

謝謝,但你知道我如何擺脫垃圾價值從存儲到我的數組? – user3298889

+0

您可能會將該數組memset爲具有'\ 0'字符。但程序應該只打印它讀取的字符 –

+0

是啊,這是它仍然在這個隨機問號 – user3298889

0

myfile.eof()將後返回true 失敗的第一次讀,你讀循環

temp = myfile.get(); 
team[il] = temp; 
il++; 

你讀一個字節與myfile.get()將在的結尾失敗文件,但您不檢查是否成功從文件中讀取一個字節。解決此問題的最簡單方法是在myfile.get()之後插入支票,但在結果做任何事之前。

temp = myfile.get(); 
if(!myfile) // use implicit conversion from stream to bool to test for success 
    break; 
team[il] = temp; 
il++; 

這不是一個特別優雅循環結構,雖然,我個人會使用這樣的:

for(char temp=myfile.get(); 
    myfile && il < sizeof(team)/sizeof(team[0]); 
    temp=myfile.get(), ++il) 
{ 
    team[il] = temp; 
} 

這工作,因爲每個後得到循環條件(myfile)將被選中,但是在執行循環體(team[il] = temp;)之前,所以不會出現將無效字符寫入team的危險。

請注意,如果myfile的長度超過80個字節,則您的代碼包含潛在的緩衝區溢出,我在上面的循環中添加了一個條件,以確保例程在文件末尾或80個字節處停止讀取 - 以先發生者爲準。

+0

他的腳本也無法用\ 0終止C字符串「team」,因此cout將繼續打印,直到碰到一個。 – DavidO

+0

我同意,它應該是空終止 - 但他實際上輸出的字符一個接一個,所以可以逃脫不null null終止如果他想要一些奇怪的原因! –