2011-06-21 8 views
15

मैं ज़िप फ़ाइलों को पढ़ने के लिए बढ़ावा Iostream API को एकीकृत करने में कामयाब रहा। मैं बढ़ावा पेज में प्रलेखन का पालन किया और तो अब तक निम्नलिखित कोड है:मैं Gzip फ़ाइलों के लिए बूस्ट IOStreams इंटरफ़ेस का उपयोग करके लाइन-बाय-लाइन कैसे पढ़ सकता हूं?

std::stringstream outStr; 
ifstream file("file.gz", ios_base::in | ios_base::binary); 
try { 
    boost::iostreams::filtering_istreambuf in; 
    in.push(boost::iostreams::gzip_decompressor()); 
    in.push(file); 
    boost::iostreams::copy(in, outStr); 
} 
catch(const boost::iostreams::gzip_error& exception) { 
    int error = exception.error(); 
    if (error == boost::iostreams::gzip::zlib_error) { 
     //check for all error code  
    } 
} 

कोड ठीक काम करता है (ताकि :) ऊपर कोई लेखन त्रुटि और त्रुटियों को अनदेखा करें।)।

  1. ऐसा लगता है कि उपरोक्त कोड फ़ाइल को पूरा करेगा और इसे फ़िल्टरिंग_स्ट्रीमबफ बनाने के दौरान स्मृति में संग्रहीत करेगा। क्या यह सच है, मेरी जांच से यह मुझे ऐसा लगता है? अगर फ़ाइल मेमोरी में पढ़ी जाती है, तो यह कोड बड़ी फाइलों के लिए एक मुद्दा हो सकता है (जो मैं कर रहा हूं)।
  2. मेरा वर्तमान कोड gzgets API का उपयोग करके zzib लाइन से gzipped को gzipped पढ़ता है। बूस्ट एपीआई का उपयोग करके लाइन पढ़ने के द्वारा लाइन करने का कोई तरीका है?

उत्तर

20

1) हां, उपर्युक्त कोड स्ट्रिंग बफर outStr में पूरी फ़ाइल copy() होगी। description of copy

के अनुसार समारोह टेम्पलेट प्रतिलिपि स्रोत की दी गई मॉडल से पढ़ता डेटा और यह सिंक की दी गई मॉडल के लिए लिखते हैं जब तक धारा के अंत तक पहुँच गया है।

2) filtering_istreambuf से filtering_istream और std :: getline() करने के लिए स्विच काम करेगा:।

#include <iostream> 
#include <fstream> 
#include <boost/iostreams/filtering_stream.hpp> 
#include <boost/iostreams/filter/gzip.hpp> 
int main() 
{ 
    std::ifstream file("file.gz", std::ios_base::in | std::ios_base::binary); 
    try { 
     boost::iostreams::filtering_istream in; 
     in.push(boost::iostreams::gzip_decompressor()); 
     in.push(file); 
     for(std::string str; std::getline(in, str);) 
     { 
      std::cout << "Processed line " << str << '\n'; 
     } 
    } 
    catch(const boost::iostreams::gzip_error& e) { 
     std::cout << e.what() << '\n'; 
    } 
} 

(क्या आप सबूत चाहते हैं कि पाश अंदर कर सकते हैं std::cout << file.tellg() << '\n'; यह खासी मात्रा में वृद्धि होगी, लेकिन यह शुरुआत से फ़ाइल की लंबाई के बराबर नहीं होगा)

+0

धन्यवाद। मुझे इसे आज़माएं। मैं कक्षा के सदस्य के रूप में < in> स्टोर करने की उम्मीद कर रहा हूं। और गेटलाइन नामक कक्षा में सदस्य कार्य करते हैं। गेटलाइन वर्तमान फ़ाइल सूचक स्थिति से लाइन वापस करने में सक्षम होना चाहिए। – cppcoder

संबंधित मुद्दे