libarchiveを使う

http://people.freebsd.org/~kientzle/libarchive/
ふむふむ。

#include <iostream>
#include <string>

#include <archive.h>
#include <archive_entry.h>

using namespace std;

namespace {
  void list(string filename) {
    archive *a = archive_read_new();
    archive_read_support_compression_all(a);
    archive_read_support_format_all(a);
    archive_read_open_filename(a, filename.c_str(), 10240);

    archive_entry *entry;
    int r;

    while ((r = archive_read_next_header(a, &entry)) == ARCHIVE_OK) {
      cout << filename << ":" << archive_entry_pathname(entry) << endl;
    }

    archive_read_finish(a);
  }
}

int main() {
  list("C:\\libarchive-2.5.904a.zip");
  list("C:\\libarchive-2.5.904a.tar.gz");
  list("C:\\libarchive-2.5.904a.tar.bz2");
  return 0;
}

C++で使うんだったら、*aをメンバ変数にもつクラスを定義した方がよいかも。