2016-05-23 90 views
0

我從它看起來像這樣一個文件中讀取一個表中讀取行的最後一個變量:C++從ifstream的

80 Sunny false 90 Play 
75 Rainy true 88 Don't play 
... 

我使用ifstream的()和事情是,我需要的價值最後一列(播放/不播放)初始化每個以前的變量。那麼有沒有辦法先得到一行的最後一個元素,然後我可以從頭開始讀取其他元素?或者,有沒有辦法從後向讀一行?

編輯0: 所以我所做的是讀整行以獲取最後一個變量,然後遍歷所有以前的變量來初始化它們。但是,這使得性能受到很大影響。所以我正在尋找一種更快的方式來做到這一點。

編輯1: 因此,每個變量都存儲爲一個也包含最後一個變量的結構。閱讀一號線以後,我將獲得結構的數組是這樣的:

(80,Play) (Sunny,Play) (false,Play) (90,Play) 

而且爲了初始化這些結構(或設置它們的第二個值),我需要知道的最後一個變量。

編輯2:對不起,我忘了補充說,「不玩」也可以是「不要玩」,它不一定有空間。

+0

你的意思是跳過4空間和閱讀它的其餘部分。對?你有答案嗎? –

+0

我只是將整行讀到一個字符串,得到最後一列,然後決定如何處理字符串的其餘部分。 –

+0

你爲什麼不把洞線看成一個字符串,然後用它做任何你想做的事情? – webNeat

回答

4

讀取一個整數,一個字符串,一個布爾值和另一個整數,然後將它們全部丟棄並使用std::getline來讀取該行的其餘部分。


在您編輯之後。

您不需要最後一部分(「玩」/「不玩」字符串)來創建四種不同的結構,您可以創建並部分初始化它們,然後讀取最後一部分並完成結構初始化。

因此讀取前四項正常,但保存他們到你有的結構。然後使用std::getline閱讀「播放」/「不播放」字符串,並使用它來完成結構的初始化。

爲了讓故障更安全一點,您可以首先使用std::getline將整行讀入字符串,將字符串放入std::istringstream並從字符串流中讀取每個元素。

1

您可以用這種解決方案的讀取一行的最後一個元素:

std::string last_line_word_1(std::istream& in) 
{ 
    std::string line; 
    std::getline(in, line); 
    std::size_t last_pos = line.find_last_of(' '); 
    if(last_pos == std::string::npos) 
    last_pos = 0; 
    else 
    ++last_pos; 
    return line.substr(last_pos, line.length() - last_pos); 
} 

std::string last_line_word_2(std::istream& in) 
{ 
    std::string line; 
    std::getline(in, line); 
    std::reverse(line.begin(), line.end()); 
    std::istringstream iss(line); 
    std::string word; 
    iss >> word; 
    std::reverse(word.begin(), word.end()); 
    return word; 
} 
+0

問題是他正在尋找的'不玩'字符串包含一個空格。 – coyotte508

+0

然後,不可能讀到「結束」,而只是「從第4個到結束」。 – Caduchon