2015-11-11 50 views
0

我最近發現了stream_iterator,它非常適合讀取文本文件,我希望忽略所有的空白字符。所以,我可以讀文件到一個載體如下:使用stream_iterator讀取分塊文件

std::ifstream infile(file path, std::ios::binary); 
std::vector<char> vec; 
vec.insert(vec.begin(), 
      std::istream_iterator<char>(infield), 
      std::istream_iterator<char>()); 

這個偉大的工程,只有讀取非空白字符,這就是我想要的。但是,我試圖以塊讀取文件,我想知道如何將這個典型示例擴展爲一次讀取n個字節。

順便說一句:我注意到這是stream_iterator特別的東西。例如,做:

std::vector<char> vec(5); 
input_file.read(&vec[0], 5); 

這不chomp空白字符。

不幸的是,我無法一次讀取整個文件,必須進行流式處理。另外,我不能使用第三個庫包,並且需要保持標準庫的使用。

+0

這不是一個選項。文件太大,不適合內存,不幸的是:/ – Luca

+0

Ahhhh ....是的,但這也不是一個選項。我應該在我的帖子中提到這一點。我會編輯它。我需要留在標準庫中。 – Luca

+0

我編輯過的帖子更清晰。 – Luca

回答

2

我不知道任何標準庫算法實現你想要做的。然而,這將是微不足道的實現它自己:

auto ReadChunk (std::istream &in, std::int64_t chunkSize) { 
    std::vector<char> ret; 
    ret.reserve(chunkSize); 
    for (std::int64_t i = 0; i < chunkSize; ++i) { 
     char c; 
     if (!(in >> c)) 
      throw std::runtime_error("Fail"); // Or some other error handling 
     ret.push_back(c); 
    } 
    return ret; 
} 

這是容易的,明確的和有效的,足以讓它不遜色於任何智能庫解決方案海事組織。

+0

謝謝!我忘記了>>操作員chomp ws也是。 – Luca