2009-03-08 38 views
8

Làm cách nào để đọc/ghi các tệp được nén trong C++?Làm cách nào để đọc/ghi các tệp đã nén?

Các lớp iostream wrapper here nhìn tốt, và đây là một ví dụ sử dụng đơn giản:

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

Nhưng tôi đã không thể thực sự liên kết nó (mặc dù tôi có một /usr/lib/libz.a). Một đơn giản

g++ test-gzstream.cpp -lz 

không làm điều đó (undefined reference to gz::gzstreambase::~gzstreambase()).

+0

Vì vậy, bạn cần phải sử dụng igzstream và tìm ra vấn đề hoặc giải pháp nào là ok? –

+0

LGPL không phải là một lựa chọn đối với tôi, vì tôi đang phát triển cho iOS, bạn có biết cách thay thế không phải là virus không? – rraallvv

Trả lời

8

Rõ ràng bạn cần tệp cpp trong đó trình phá hoại gzstreambase cũng được xác định, tức là gzstream.cpp (đó là lỗi liên kết). libz chỉ là một c-api cho gzip, nó không biết gì về C++ stdlib stream.

lib iostream của Boost cũng có luồng gzip và bzip2.

CHỈNH SỬA: Cập nhật liên kết để trỏ đến phiên bản mới nhất của mã bao gồm sửa lỗi chính.

+0

anh ấy sử dụng lib thay vì tệp .cpp. –

+0

Sau đó, anh ta cần liên kết đến lib nơi gzstream.cpp đã được biên dịch. liblm_access? – Macke

+0

Cảm ơn, chỉ biên dịch cùng với các công trình gzstream.cpp. – Frank

1

Đây là từ "Gzstream Thư viện Home Page"

Hoặc biên dịch gzstream.C bằng tay, đặt nó trong một số thư viện và di chuyển gzstream.h vào phần bao gồm tìm kiếm đường dẫn trình biên dịch của bạn. Hoặc sử dụng cung cấp Makefile, điều chỉnh các biến số của chúng tôi và thực hiện theo các nhận xét trong Makefile.

12

Để cung cấp thêm chi tiết so với những gì được người dùng khác đề cập một thời gian ngắn, dưới đây là cách tôi quản lý hoạt động với gzstream trên máy tính của mình.

Trước tiên, tôi đã tải về gzstream và cài đặt nó trong nhà của tôi (hai dòng cuối cùng có thể được thêm vào ~/.bash_profile của bạn):

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 

Sau đó, tôi đã thử nghiệm cài đặt:

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

Cuối cùng , Tôi đã viết một chương trình giả để kiểm tra xem tôi có thể sử dụng thư viện hiệu quả không:

cd ~/temp 
vim test.cpp 

Đây là mã (rất tối giản, nên được cải thiện nhiều cho các ứng dụng thực tế!):

#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; 
} 

Dưới đây là làm thế nào tôi biên soạn nó:

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

Và cuối cùng nhưng không kém, đây là cách tôi sử dụng nó:

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

tôi gặp khó khăn này cũng như với trình biên dịch GCC cũ. Tôi chỉ cố định điều này bằng cách làm cho một phiên bản tiêu đề chỉ của gzstream mà nên được dễ dàng hơn để sử dụng.

https://gist.github.com/1508048

Các vấn đề liên quan