2016-03-05 35 views
1

我的文本文件看起來像這樣:逐行讀取文件中的行和存儲不同的變量

1  52 Hayden Smith  18:16 15 M Berlin 
2  54 Mark Puleo   18:25 15 M Berlin 
3  97 Peter Warrington 18:26 29 M New haven 
4  305 Matt Kasprzak  18:53 33 M Falls Church 
5  272 Kevin Solar   19:17 16 M Sterling 
6  394 Daniel Sullivan  19:35 26 M Sterling 
7  42 Kevan DuPont  19:58 18 M Boylston 
8  306 Chris Goethert  20:00 43 M Falls Church 
9  262 James Sullivan  20:12 28 M Sterling 
10 348 Bill Gaudere  20:17 54 M Hudson 
11 13 Travis Wheeler  20:23 31 M Clinton 
12 69 Eric Anderson  20:34 54 M Clinton 
13 341 Alex Teixeira  20:46 0 M Clinton 
14 112 James Long   20:50 38 M 0 
15 279 Nate Richards  21:31 17 M Berlin 
...................................................... 

有八列,通過「標籤」分開,除第一個名字和姓氏用空格隔開。

我必須有八種不同類型的變量。

int a; 
    int b; 
    string c; 
    string d; 
    string e; 
    int f; 
    char g; 
    string h; 

我需要逐行讀取文件行和cout每行的a,b,c,d,e,f。 我也需要這些變量供以後使用。

所以,我嘗試這樣做:

std::ifstream infile("text.txt"); 
int a; 
int b; 
string c; 
string d; 
string e; 
int f; 
char g; 
string h; 


while(infile>>a>>b>>c>>d>>e>>f>>g>>h) 
{ 
    cout <<"C is: "<<c<<endl; // just to see if the loop is working. 

} 

我不需要陣列和載體來存儲這些變量,我有一聯結構。現在,我只需要一種方法來讀取文件並將這些字符串和整數存儲到變量中。 但它不工作,哈哈。不知道爲什麼。我也想過用函數getline,這樣的事情:

while(getline(infield, s)): 

但是,是不是這本質上只是給了我一個大胖子線,所有的字符串和整數一起搗爛。

+0

我不完全確定你是否可以在一行中做到這一點,但我會建議反對它。每讀入一個條目,都有可能出現錯誤(例如錯誤類型)。我想你會想要編寫檢查錯誤的代碼(或者至少是調試代碼)。此外,它並沒有在一個表達式中完成很多性能增益,而是在多個表達式中進行。 – Nard

+2

將該文件格式作爲八列處理是您的方法的一大問題。有人會在那裏輸入像「Lee Harvey Oswald」或「Barrack Hussein Obama」這樣的名字來殺死你的節目。不,第一個名字和第二個名字之間沒有標籤是有原因的,原因是它們應該被認爲是一列。順便說一句,這也適用於紐黑文。順便說一句:文件格式家族被稱爲CSV,即使它是一個製表符而不是逗號,你應該在網上找到足夠的信息來解析它。 –

回答

2

你的方法效果完全一樣,你想讓它測試它時,我的機器上,除了事實,這將在第三項中停止:

3  97 Peter Warrington 18:26 29 M New haven 

這是因爲在New haven的空間中,這將在下一次迭代時無法複製到整數字段a中,從而使條件失敗。如果你想保持這種結構,也許把下劃線代替空格。否則,可以使用std::regex庫逐行解析它。

例如,將位置字符串更改爲由下劃線而不是空格分隔將導致查找所有15個條目。要改變下劃線回我們可以使用std::replace空間,所以你的while循環的身體看起來LILE:

std::cout <<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" "; 
std::replace(h.begin(), h.end(), '_', ' '); 
std::cout<<h<<"\n"; 

(確保包括algorithm

現在我們已經印製了所有entires!

要直接回答你原來的問題,我猜這個文件不存在。

std::ifstream infile("text.txt"); 
if(!infile.is_open()) { 
    std::cout<<"Couldn't find file"; 
    return 0; 
} 
// .. 
+0

謝謝!那麼如果有一條線沒有一個名字,那麼這個人和一個城鎮就只有那六個變量。我剛剛在我的文本文件中發現。 – JY078

+0

如果其中任何一個人失蹤,您將遇到問題。也許可以在while循環之外移動不太重要的閱讀調用('infile >> x'),以使它們正常失敗。這種方式不會在事物丟失等情況下崩潰。雖然這確實意味着您必須驗證稍後獲得的輸入是否有效。 –