【问题标题】:What's wrong with my code? (Printing File names inside an Archive File)我的代码有什么问题? (在存档文件中打印文件名)
【发布时间】:2013-07-16 17:27:44
【问题描述】:

我正在尝试编写一个程序来从 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 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;
}

【问题讨论】:

    标签: c operating-system unix-ar


    【解决方案1】:

    我在任何地方都看不到您定义 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);
    }
    

    【讨论】:

    • 我可以想象#include &lt;ar.h&gt; 提供了struct ar_hdr 的定义。当然,buffer 的内容永远不会复制到my_ar.ar_name 的事实说明了垃圾被打印了。
    • 感谢您的提示。我对此很陌生,所以我不确定我是否明白你所说的一切。你介意告诉我如何将缓冲区复制到 ar_name 中吗?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多