2016-01-08 84 views
0

我在Windows上編程C. 我在嘗試讀取.tar.gz文件時遇到此問題。閱讀.tar.gz文件

文件看起來像(用記事本+ +中打開): enter image description here

和我以前看過的代碼如下:

iFile = fopen("my.tar.gz", "r"); 
while ((oneChar = fgetc(iFile)) != EOF) { 
     printf("%c", oneChar); 
} 

下圖顯示了我的程序的結果: enter image description here

我遇到的問題是,結果只有幾行,而原始文件有成千上萬行(6310行,如你所見)。我的猜測是.tar.gz文件包含一些奇怪的字符(如文件中間的EOF?)。

我的問題是爲什麼記事本++可以顯示整個文件,而我的程序不能。有沒有解決這個問題的方法?

+0

請張貼一個完整的例子。特別是,如何聲明'oneChar'會很有趣。它應該是'int'。以十六進制格式打印文件並與['hexdump']的輸出進行比較可能會更有幫助(http://manpages.debian.org/cgi-bin/man.cgi?query=hexdump&sektion=1),if你有。二進制文件中的尷尬字符可能會導致終端覆蓋自身。最後,在'「rb」'模式下打開文件。 – 5gon12eder

+0

那裏沒問題。我曾聲明:int oneChar; – Emma

+0

**爲什麼**要打開並閱讀'.tar.gz'文件?這很可能是無用的。並請**編輯您的問題**不要評論它...順便說一句,您的問題是操作系統的具體情況,所以請標記與您的操作系統相關的標記。 –

回答

3

A .tar.gz文件是傳統上 a gnu-zipped壓縮一些tar archive。這當然是一個二進制文件(裏面任何'\n''\r'並不限制線,並且'\0'可能裏面出現),所以你需要用

iFile = fopen("my.tar.gz", "rb"); 
if (!iFile) { perror("my.tar.gz"); exit(EXIT_FAILURE); } 

而且打開它,feof(iFile)只有後有效一些<stdio.h>輸入操作,從而while(!feof(iFile))是錯的只是fopen ...

之後,但不會幫助你從檔案中提取的任何文件。

因此,您需要首先解壓該文件,然後提取或列出其中的相關存檔文件。

你可以找到兩個非壓縮(zlib librarygunzipzcat命令)和歸檔提取(libarchive庫,或libtar,或tar命令)步驟庫(和命令可執行文件)。

如果你的操作系統提供了它,你可以考慮適當地使用popen function

BTW使用putchar(oneChar)更短,更簡單,比printf("%c", oneChar) ....

+1

非常感謝,「rb」解決了這個問題! – Emma

3

快結束通常的tar.gz文件是壓縮tar文件)的二進制文件)。因此,我建議您使用popenhttp://linux.die.net/man/3/popen)而不是fopen使用命令打開文件。

iFile = popen("zcat my.tar.gz | tar xf -", "r"); 
+0

我需要#include 到我的程序嗎?我正在使用Windows .. – Emma

+0

我不積極,但我相信OP是在窗戶上。我不知道是否有'zcat.exe',但* 7zip *命令行可執行文件'7z.exe'可能會提供與'-tgzip'選項類似的功能。你只需要確認如何將輸出重定向到'stdout' –