2014-08-28 79 views
0

我一直在使用googling一段時間無濟於事,我甚至不確定是否有這個名稱。在零件中閱讀文件,在最後閱讀一段時間後繼續

我的用例是:我有一個大文件,其中包含應該獨立處理的文本塊。它們全部列在文件中,並用分隔符分隔。我希望逐塊讀取該文件,並在讀取塊上執行一些操作,然後讀取下一個塊。像遍歷文件一樣,但不是一次全部讀取到內存。我有java代碼,通過某種實現可迭代接口的BlockGen類來實現,並在客戶端代碼需要時從先前讀取的位置讀取文件,但我不確定如何在C++中正確實現。

任何幫助表示讚賞。是的,這不是功課!

+0

塊是否固定大小?你如何習慣在C++中讀取文件? – doctorlove 2014-08-28 08:28:09

+0

它們被包含在某種分隔線中,因此我知道它們的開始和結束位置。我想將文件讀取封裝到一個單獨的函數/類中,這樣所有的getline東西都不在塊處理函數中。理想情況下,塊處理函數只會說blockgen.getNextBlock()或者像這樣。 – darxsys 2014-08-28 08:29:31

+0

也許你應該包含一些顯示分隔符的示例文件。你可以使用內存映射文件或者一些緩衝(讀取前面的內容)來獲取每一行。 – firda 2014-08-28 08:32:02

回答

1

對於固定塊大小,您可以使用ifstream::read

在你的情況,也不會太硬推出自己的BlockGen

給出的定義Block例如一個std::vector<std::string>,和一個類(適合雖然給予複製構造等)

class BlockGen 
{ 
    public: 
    //boilerplate constructors, taking delimiter between blocks 
    // opening input etc, etc 

    Block getNextBlock() 
    { 
     Block block; 
     std::string line; 
     while(std::getline(input, line) && line!=delimiter) 
     { 
      block.push_back(line); 
     } 
     return block; 
    } 

    private: 
    std::ifstream input; 
    std::string delimiter; 
}; 
+0

我認爲就是這樣,只要有一個ifstream類型的私人成員,可以「記住」它應該繼續閱讀的地方。我想知道如果這是足夠乾淨.. – darxsys 2014-08-28 10:17:05

+0

這是「乾淨」的意義上,如果任何崩潰的文件被關閉。如果每個塊有兩個分隔符,你可能需要繞過你忽略的那些線,但希望這足以讓你開始。 – doctorlove 2014-08-28 10:23:21

+0

是的,我對此並不是很熟悉。所以如果smth崩潰,文件將被關閉?除此之外,是的,這就是我一直在尋找的。謝謝。 – darxsys 2014-08-28 10:27:00