c - 读取 .tar.gz 文件

标签 c file

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

文件看起来像(用 Notepad++ 打开): 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?)。

我的问题是为什么notepad++可以显示整个文件而我的程序不能。这个问题有解决方案吗?

最佳答案

A .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> 之后有效输入操作so while(!feof(iFile))fopen 之后是错误的...

但这不会帮助您从存档中提取任何文件。

因此您需要先解压缩该文件,然后提取或列出其中的相关存档文件。

您可以找到用于解压缩( zlib librarygunzipzcat 命令)和存档提取( libarchive 库、libtartar 命令)的库(和命令可执行文件) ) 步骤。

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

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

关于c - 读取 .tar.gz 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34670373/

相关文章:

java - 文件下载代码下载比原始文件大的文件

c - 帮助使用 LD_PRELOAD

c - 在 eclipse make 文件项目中包含标准 c 库

c - 小型可移植数字签名和验证库

mysql - 将脚本传输到新服务器后,SQL 和文件系统之间的编码文件名不匹配

java - java中如何向txt文件添加内容

c - 线程不并行运行

c - "peek"入eventfd内部计数器值不变

ios - 翻译 Assets 库 ://scheme to file://in order to share to instagram while keeping metadata

ruby - Ruby 中的通用换行符支持,包括\r (CR) 行尾