提取文件时,libarchive读取的字符太多
我编写了一个C程序,使用libarchive从tar归档文件中提取文件 我想从这个档案中提取一个文件,并将其打印到标准输出但是我得到了额外的字符。它是垃圾,但它来自另一个文件(可能在存档中与它相邻)。我希望输出在提取文件时,libarchive读取的字符太多,c,malloc,tar,C,Malloc,Tar,我编写了一个C程序,使用libarchive从tar归档文件中提取文件 我想从这个档案中提取一个文件,并将其打印到标准输出但是我得到了额外的字符。它是垃圾,但它来自另一个文件(可能在存档中与它相邻)。我希望输出在处结束 下面是代码,内容如下: #包括 #包括 #包括 #包括“archive.h” #包括“archive_entry.h” int main(int argc,const char*argv[] { 结构档案*a; 结构存档项目*项目; INTR; int64输入大小; a=存档\读
处结束
下面是代码,内容如下:
#包括
#包括
#包括
#包括“archive.h”
#包括“archive_entry.h”
int main(int argc,const char*argv[]
{
结构档案*a;
结构存档项目*项目;
INTR;
int64输入大小;
a=存档\读取\新建();
存档\读取\支持\压缩\无(a);
存档、读取、支持、格式、tar(a);
r=存档文件名(a,“0000.tar”,1024);
如果(r!=存档\u正常)
{
printf(“未找到档案”);
}
其他的
{
while(存档\u读取\u下一个\u标题(a,&条目)=存档\u确定)
{
const char*currentFile=archive\u entry\u路径名(entry);
char*文件内容;
entry_size=archive_entry_size(entry);//获取文件的大小
fileContents=malloc(entry_size);//足够分配字符串-从我的测试中,我看到这是tar和ls从命令行报告的字节数
archive_read_data(a,fileContents,entry_size);//将数据读入fileContents字符串,以获得HTML文件大小
if(strcmp(当前文件,“vendar definition.html”)==0)
{
printf(“文件名=%s,大小=%lld\n”,当前文件,条目大小);
printf(“%s\n\n”,fileContents);//此输出过度读取此tar文件中另一个文件的字符
}
free(fileContents);//释放C字符串,因为我
}
}
printf(“退出”);
返回0;
}
在mac os X 10.6.3上编译。gcc 4.2 x86_64
ls-l vendar definition.html
为我提供了文件大小的1921
。因此显示了tar tfv 0000.tar | grep vendar definition.html
。因此,报告说明文件大小的C输出。对我来说,这似乎是正确的
我可以看到两种可能的情况来解释为什么我的输出不符合预期:
%s
说明符将文件内容输出到printf
,该说明符要求输入为以null结尾的字符串。存档中文件的内容可能不为空终止,并且可以在中间包含任意的空值。
请尝试这样输出:
fwrite(fileContents, sizeof(char), entry_size, stdout);
我可能大错特错,但这看起来不像是以null结尾的字符串(我认为
archive\u read\u data
不会处理这个问题)。添加一个空字符,或者查看并告诉我们它是如何运行的。显然不是。很好,那个链接让我明白了。谢谢如果fileContents和currentFile在while的块之外声明不是更好吗?另外,我的gcc在尝试对fileContents使用char*而不是void*时会抱怨。这样,就解决了一个简单的printf(“%s”,fileContents)。请检查它是否适合你。
fwrite(fileContents, sizeof(char), entry_size, stdout);