كيف يمكنني قراءة/كتابة الملفات المضغوطة في C++؟

StackOverflow https://stackoverflow.com/questions/624250

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكنني قراءة/كتابة الملفات المضغوطة في C++؟

ال iostream فئات المجمع هنا تبدو جيدة، وهنا مثال استخدام بسيط:

gz::igzstream in(filename);
std::string line;
while(std::getline(in, line)){
  std::cout << line << std::endl;
}

لكنني لم أتمكن من ربطه فعليًا (على الرغم من أن لدي ملف /usr/lib/libz.a).بسيط

g++ test-gzstream.cpp -lz

لم أفعل ذلك(undefined reference to gz::gzstreambase::~gzstreambase()).

هل كانت مفيدة؟

المحلول

ومن الواضح أن كنت في حاجة إلى ملف حزب الشعب الكمبودي حيث يتم تعريف المدمر gzstreambase كذلك، أي <لأ href = "http://www.cs.unc.edu/Research/compgeom/gzstream/#inst" يختلط = "noreferrer "> gzstream.cpp (وهذا هو خطأ وصلة). libz هو مجرد ج-API لغزيب، فإنه لا يعرف شيئا عن ج ++ تيارات stdlib.

وليب iostream دفعة لديه غزيب وBZIP2 تيارات أيضا.

وتحرير: تم تحديث الرابط ليشير إلى أحدث إصدار من التعليمات البرمجية التي تشمل إصلاح خلل كبير.

نصائح أخرى

فكر في استخدام مرشحات Boost zip.وفقا لهم، فإنه يدعم bzip, gzip و zlib شكل.

لاعطاء المزيد من التفاصيل عما ذكر لفترة وجيزة من قبل المستخدمين الآخرين، وهنا هو كيف تمكنت من العمل مع gzstream على جهاز الكمبيوتر الخاص بي.

أولا، أنا تحميل gzstream وتثبيته في بيتي (الخطين مشاركة يمكن أن تضاف إلى ~/.bash_profile الخاص بك):

cd ~/src
mkdir GZSTREAM
cd GZSTREAM/
wget http://www.cs.unc.edu/Research/compgeom/gzstream/gzstream.tgz
tar xzvf gzstream.tgz
cd gzstream
make
export CPLUS_INCLUDE_PATH=$HOME/src/GZSTREAM/gzstream
export LIBRARY_PATH=$HOME/src/GZSTREAM/gzstream

وبعد ذلك، أنا اختبار التركيب:

make test
...
# *** O.K. Test finished successfully. ***

وأخيرا، كتبت برنامج وهمية للتأكد من أن أتمكن من الاستخدام الفعال للمكتبة:

cd ~/temp
vim test.cpp

وهنا هو رمز (الحد الأدنى للغاية، ويجب أن تكون تحسنت كثيرا عن تطبيقات حقيقية!):

#include <iostream>
#include <string>
#include <gzstream.h>
using namespace std;

int main (int argc, char ** argv)
{
  cout << "START" << endl;

  igzstream in(argv[1]);
  string line;
  while (getline(in, line))
  {
    cout << line << endl;
  }

  cout << "END" << endl;
}

وهنا هو كيف أنا جمعت ما يلي:

gcc -Wall test.cpp -lstdc++ -lgzstream -lz

وأخيرا وليس آخرا، هنا هو كيف كنت عليه:

ls ~/ | gzip > input.gz
./a.out input.gz
START
bin/
src/
temp/
work/
END

وكان لي هذه المشاكل، وكذلك مع المترجم دول مجلس التعاون الخليجي القديم. أنا فقط إصلاح هذا بجعل رأس نسخة فقط من gzstream التي ينبغي أن تكون أسهل للاستخدام.

https://gist.github.com/1508048

وهذا هو من "Gzstream المكتبة الصفحة الرئيسية"

<اقتباس فقرة>   

وإما تجميع gzstream.C من جهة،   وضعه في بعض المكتبات، والتحرك   gzstream.h إلى التضمين البحث   طريق المترجم الخاص بك. أو استخدام   قدمت ماكيفيلي، والتكيف لها   المتغيرات، ومتابعة الملاحظات في   ماكيفيلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top