c语言 - 我的代码有什么问题?(打印存档文件中的文件名)



我正试图编写一个程序,从Unix打开一个归档文件,读取文件并打印归档文件中的文件以及文件名。下面是我的代码——它编译了,但我在终端中得到了一些奇怪的输出——例如?;?U它应该只显示2个txt文件名。有人能看看我的代码,并就我缺少的内容给我一些指导吗?非常感谢。

编辑:我对代码做了一些更改,但它仍然不起作用。非常感谢任何建议或帮助。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/utsname.h>
#include <ctype.h>
#include <string.h>
#include <ar.h>

int main (int argc, char **argv)
{
    int input_fd;
    //char buffer[25];
    struct ar_hdr my_ar;
    if (argc != 2) {
        printf("Error", argv[0]);
        exit(EXIT_FAILURE);
    }

    //open the archive file (e.g., hw.a)
    input_fd = open(argv[1], O_RDONLY);
    if (input_fd == -1)
    {
        perror("Can't open input filen");
        exit(-1);
    }
    while (read(input_fd, my_ar.ar_name, sizeof(buffer)) > 0) {
        printf("%sn", my_ar.ar_name);
    }
    close(input_fd);
    return 0;
}

我没有看到你在任何地方定义my_hdr是什么,但你在这里打印它的一个假定成员:

printf("%sn", my_ar.ar_name);

您也从未将ar_name设置为任何值。

我看到您将一些数据读取到一个名为buffer的变量中,但您从未实际将该缓冲区复制到ar_name中,我认为这是您的意图。

while (read(input_fd, buffer, sizeof(buffer)) > 0) {
    printf("%sn", my_ar.ar_name);
}

POSIX文档明确指出,没有描述归档文件格式,因为已经存在几种不兼容的此类格式,因此如果要使用<ar.h>而不是ar命令行实用程序,您肯定需要研究操作系统提供的文档。

以下是一些基于Solaris实现的可能有帮助的细节:

  1. 存档文件以一个神奇的cookie字符串开始,您既不验证也不跳过该字符串
  2. 每个头对象后面都是存档中实际对象的内容,您不会忽略这些内容
  3. 档案中的第一个对象是包含档案的符号表的未命名对象
  4. 如果对象的名称长度超过十五个字节,则它将存储在存档的字符串表中,该字符串表似乎是符号表的一部分

请注意,这些要点或细节可能因操作系统而异。正如我在开头所说,请研究您的操作系统提供的文档。

相关内容

  • 没有找到相关文章

最新更新