读取和写入linux中的tar.gz文件的内容

时间:2015-03-17 04:51:35

标签: c linux gzip tar

我正在尝试打开tar.gz文件并将该文件的内容读入缓冲区。我想创建另一个tar.gz文件并将缓冲区写入新创建的tar.gz文件。新文件是否与前一个文件相同?代码如下:

int main()
{
    FILE *fp,*fp1;
    int len,len1;
    int length=0;
    char *buf=malloc(1024);

    char *buf1=malloc(1024);
    fp=fopen("/home/sharwari/Downloads/criu-1.4/3049.tar.gz","rb");

    while((len=fread(buf,1024,1,fp))>0)
    {
        printf("%s",buf);
    }

    fclose(fp);

    fp1=fopen("/home/sharwari/imp5.tgz","wb");

    if(fp1==NULL)
        printf("\n\terror in creating file...");

    len1=fwrite(buf,1,strlen(buf),fp1);


    printf("\n\t No. of bytes written: %d",len1);

    fclose(fp1);
}

3 个答案:

答案 0 :(得分:0)

您有正确的想法,但您的代码存在许多问题。至少包括:

  1. while循环将导致丢弃除最后1024个字节之外的所有内容。因为你继续读取1024字节并覆盖buf。
  2. 的内容
  3. 您不能在二进制数据上使用strlen。
  4. 您需要对fread进行更多错误检查,以确定您是否已成功读取文件末尾或是否发生错误。阅读fread手册页(它将指向你的feof和ferror)。
  5. 释放任何malloced记忆的好习惯。

答案 1 :(得分:0)

  1. 您使用错误的参数调用fwrite(buf,1,strlen(buf),fp1);。 应该是
  2. fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

    1. 您正在尝试读取1024个字节的块,如果文件大小小于1024个字节,则会失败
    2. 使用以下代码,您尝试从源文件逐字节复制到 目标文件。 您可以参考以下代码。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
          FILE *fp,*fp1;
          int len,len1 = 0;
          char buf[1];
      
          fp = fopen("/home/sharwari/Downloads/criu-1.4/3049.tar.gz","rb");
          fp1 = fopen("/home/sharwari/imp5.tgz","wb");
      
          if (fp == NULL || fp1 == NULL) {
              printf("\n\terror in creating file...");
              return -1;
          }
      
          while ((len = fread(&buf, 1, 1, fp)) > 0) {
             len1 += fwrite(&buf, 1, 1, fp1);
          }
      
          printf("\n\t No. of bytes written: %d",len1);
      
          fclose(fp1);
          fclose(fp);
      
          return 0;
      }
      

答案 2 :(得分:0)

是不是有点过度杀戮到缓冲区。根据定义,fopen,fread等已经被缓冲并以最佳方式处理实际的io。代码应该更像

while(1){

if(i = fgetc(in)== EOF)break;

其他fputc(i,out);

}