0

アーカイブ ファイルから読み取り、最初のファイルを抽出する while ループがあります。

  int fd = open(argv[2], O_RDWR | O_CREAT, 0666);
  char name_buffer[16];
  char size_buffer[10];

  // go to the first header
  lseek(fd, SARMAG, SEEK_CUR);

  // store the number of bits read in a struct current_header
  // until its size equal to the size of the entire
  // header, or in other words, until the entire
  // header is read
  while ((num_read = read(fd, (char*) &current_header, 
    sizeof(struct ar_hdr))) == sizeof(struct ar_hdr))
  {

    // scans the current string in header and stores
    // in nameStr array
    sscanf(current_header.ar_name, "%s", name_buffer);
    sscanf(current_header.ar_date, "%s", date_buffer);
    sscanf(current_header.ar_uid, "%s", uid_buffer);
    sscanf(current_header.ar_gid, "%s", gid_buffer);

    int mode;
    sscanf(current_header.ar_mode, "%o", &mode);
    sscanf(current_header.ar_size, "%s", size_buffer);
    sscanf(current_header.ar_fmag, "%s", fmag_buffer);

    new_file_fd = open(name_buffer, O_WRONLY | O_CREAT | O_TRUNC);
    int size = atoi(size_buffer);
    char buf[size];
    size_t count = size;

    while ((n_read = read(fd, buf, size)) > 0)
    {
      n_write = 0;
      do {
        n = write(new_file_fd, &buf[n_write], n_read - n_write);
        n_write += n;
      } while (n_write < n_read);

    }
    close(new_file_fd);
   }
   lseek(fd, size + (size%2), SEEK_CUR);

構造を持つ特定のアーカイブ ファイルの場合:

!<arch>
File1             1382142494  501   20    100644  29        `
Testing 123

File2             1382142504  501   20    100644  23        `
Testing 246

予想される出力は、コンテンツ「Testing123」のみを含むファイル「File1」である必要があります。代わりに、次の内容の File1 を取得します: Testing 123

File2             1382142504  501   20    100644  23        `
Testing 246

何らかの理由で、読み書きするビット数を指定したにもかかわらず (パラメータ 3 は 29 を返す「サイズ」であり、File1 のサイズです)、29 バイトを超えても読み書きを続けます。

なぜこれが起こっているのでしょうか?

4

1 に答える 1