C 指定字节长度的读写问题

标签 c file-io systems-programming read-write

我有一个 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

预期输出应该是文件“File1”,其中仅包含内容“Testing123”。 相反,我得到 File1 的内容: 测试123

File2             1382142504  501   20    100644  23        `
Testing 246

出于某种原因,即使我指定了要读取和写入的位数(参数 3 是“大小”,它返回 29——File1 的大小),它仍然会读取和写入超过 29 个字节。

知道为什么会发生这种情况吗?

最佳答案

while ((n_read = read(fd, buf, size)) > 0)

您需要更新循环内的大小。

大小 -= n_read

否则,您将继续循环,直到到达文件末尾。您需要循环调用 read() 的原因只是它不能保证在第一次调用时读取指定数量的字节,它只保证不会超过该数量。因此,您需要继续调用它,直到读取完所需的所有字节为止。但您确实需要更新 bytes 参数,因为否则文件描述符 fd 将继续前进到文件末尾。

关于C 指定字节长度的读写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19466987/

相关文章:

c - C语言中的150位数字乘法

c - 从系统发送到 Unix 的命令中转义字符

c# - 防止多个线程写同一个文件

c++ - 我不断收到 'std::invalid_argument' what() : stoi exception thrown for seemingly no reason?

c - 匹配 JPEG 签名

c - sigaction系统调用: what if sa_mask includes one of the blocked signals?

我可以在单独的函数中安装信号处理程序吗

c - 使用 8 位整数作为标志掩码

android - 了解 android 内部结构(深入系统)

c - 如何在 Linux 上使用另一个 libC 进行编译? (海湾合作委员会)