Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取文件时,libarchive读取的字符太多_C_Malloc_Tar - Fatal编程技术网

提取文件时,libarchive读取的字符太多

提取文件时,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=存档\读

我编写了一个C程序,使用libarchive从tar归档文件中提取文件

我想从这个档案中提取一个文件,并将其打印到标准输出但是我得到了额外的字符。它是垃圾,但它来自另一个文件(可能在存档中与它相邻)。我希望输出在
处结束

下面是代码,内容如下:

#包括
#包括
#包括
#包括“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);