2016-11-17 42 views
0

我得到getline(ifstream foo, string bar)函數的語法,我知道它的第三個參數是分隔符,它被設置爲'\ n'。使用getline從輸入文件流中讀取字符串和數字

我有一個文件要讀取,它有第一和第二列的數字。 問題是在第三列中,我必須讀取可能包含空格的國家的名稱。

我檢查過我的代碼是成功地從前兩列中讀取數字的,但是當我的代碼嘗試讀取國家名稱時,出現'Segmentation fault (cord dumped)'錯誤消息。

我的代碼如下所示:

string name[50]; 
double year1[50],year2[50]; 
fstream ifstr; 
ifstr.open("thefile.csv"); 
for (int i=0; (!(ifstr.eof())) || i < 51; i++) { 
ifstr >> year1[i] >> year2[i]; 
getline(ifstr, name[i]);} // expecting this line to be reading/storing 
//anything that comes after 3rd column into string array 

我分配給定的變量是太漫長而複雜,讓我有種寫道,以幫助可讀性,但是這一條線是相當多的問題。

從說明書,我的教授提到

閱讀羣體很簡單,並且可以使用我們課堂上的 標準文件IO函數來完成(即「>>」使用 輸入流)。但是,由於某些國家/地區的名稱包含 空格,因此我們需要在名稱字段中使用getline而不是>>。 幸運的是,這個國家是最後一個領域,所以我們可以用「>>」來讀取 人羣,然後用getline來完成這一行。 您需要輸入數據直到文件結束。回想一下,如果文件結束,getline的返回值是false,所以它的 很容易檢查。

我查了一下所有關於這個主題的資源,但是我找不到解決這個問題的人。

請指教。

+3

你的組合['而(!EOF)'](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-錯誤)反模式,並且讀出界限(例如,訪問'year1 [50]'是未定義的行爲)。 – user657267

回答

1

您的循環條件錯誤。你只應該循環,而這兩個值都是。如果他們中的任何一個變得虛假,你應該停止。所以||實際上應該是&&

您還有一個超出範圍的問題。條件i < 51是錯誤的。如果索引它們,i的值爲50會使數組溢出。所以正確的條件是i < 50

最後,eof不是應該導致您停止閱讀的流的唯一條件。只需使用流的布爾操作符。

+0

感謝您的糾正。仍然在修復後,分段錯誤仍然存​​在。你有什麼想法嗎? – Minjae

+0

用啓用調試符號編譯你的程序('-g'標誌)。附加一個調試器,比如'gdb'並運行你的程序。讓它崩潰,並使用'bt'調試器命令向您顯示調用堆棧。這會告訴你哪一行代碼導致了問題。 – paddy

+0

如果沒有'getline'的行,文件就可以毫無問題地編譯/運行 – Minjae

相關問題