【问题标题】:reading a .tar.gz file读取 .tar.gz 文件
【发布时间】:2016-01-08 05:53:12
【问题描述】:

我正在 Windows 上编程 C。 我在尝试读取 .tar.gz 文件时遇到了这个问题。

文件看起来像(用记事本++打开):

我以前看的代码如下:

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

下图显示了我的程序的结果:

我遇到的问题是,结果只有几行,而原始文件有数千行(如您所见,6310 行)。我的猜测是 .tar.gz 文件包含一些奇怪的字符(比如文件中间的 EOF?)。

我的问题是为什么 notepad++ 可以显示整个文件,而我的程序却不能。有没有办法解决这个问题?

【问题讨论】:

  • 请发布一个完整的例子。特别是,您如何声明oneChar 会很有趣。应该是int。如果有的话,以十六进制打印文件并与hexdump 的输出进行比较也可能更有帮助。二进制文件中的笨拙字符很可能会导致您的终端自行覆盖。最后以"rb"模式打开文件。
  • 那里没问题。我确实声明了:int oneChar;
  • 为什么您要打开并阅读.tar.gz 文件?它很可能是无用的。请编辑您的问题不要评论它......顺便说一句,您的问题是特定于操作系统的,所以请用您的操作系统相关标签标记它。

标签: c file


【解决方案1】:

.tar.gz 文件通常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 库、libtartar 命令)的库(和命令可执行文件) ) 步骤。

如果您的操作系统提供它,您可以考虑适当地使用popen function

顺便说一句,使用putchar(oneChar)printf("%c", oneChar) 更短、更简单、更快......

【讨论】:

    【解决方案2】:

    通常以tar.gz 结尾的文件是一个压缩的tar 文件(一个二进制文件)。因此我建议您使用popen (http://linux.die.net/man/3/popen) 而不是fopen 来使用命令打开文件。

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

    【讨论】:

    • 我不肯定,但我相信 OP 在 Windows 上。我不知道是否有zcat.exe,但7zip 命令行可执行文件7z.exe 可能提供与-tgzip 选项类似的功能。您只需要确认如何将输出重定向到stdout
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多