我的代码出了什么问题? (在存档文件中打印文件名)

时间:2013-07-17 23:28:38

标签: c operating-system ar

我正在尝试编写一个程序来从Unix打开一个存档文件,读取文件并打印存档中的文件和文件名。下面是我的代码 - 它编译,但我在终端中得到了一些奇怪的输出 - 例如?;?ü?它应该只显示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 file\n");
        exit(-1);
    }

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

    close(input_fd);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

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

printf("%s\n", my_ar.ar_name);

您也永远不会将ar_name设置为任何内容。

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

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

答案 1 :(得分:0)

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

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

  1. 存档文件以魔术cookie字符串开头,您既不验证也不跳过,
  2. 每个标题对象后面跟着档案中实际对象的内容,您没有踩过它,
  3. 存档中的第一个对象是一个包含存档符号表的未命名对象
  4. 如果对象的名称长度超过15个字节,它将存储在存档的字符串表中,该表似乎是符号表的一部分。
  5. 请注意,这些要点或详细信息可能会因您的操作系统而异。正如我在开始时所说,研究您的操作系统提供的文档。