5

免责声明:这是一个任务。我不是要求明确的代码。相反,我只要求足够的帮助,以便我可以理解我的问题并自己纠正它。

我正在尝试ar根据家庭作业重新创建 Unix 实用程序。这个任务的大部分处理 C 中的文件 IO,其他部分处理系统调用等。

在这种情况下,我打算创建存档中所有文件的简单列表。正如你所注意到的,我还没有走多远。该计划相对简单:从存档文件中读取每个文件头并仅打印ar_hdr.ar_name. 其余字段将被跳过fseek(),包括文件数据,直到到达另一个文件,此时该过程再次开始。如果达到 EOF,则函数简单地终止。

我对文件 IO 没有什么经验,所以我在这个任务上已经处于劣势。我已尽我所能研究实现目标的正确方法,并且我相信我已尽我所能实现了它们。也就是说,我的实现似乎有问题。存档文件中的数据似乎没有被读取,或者至少存储为变量。这是我的代码:

struct ar_hdr
{
    char ar_name[16];   /* name */
    char ar_date[12];   /* modification time */
    char ar_uid[6];     /* user id */
    char ar_gid[6];     /* group id */
    char ar_mode[8];    /* octal file permissions */
    char ar_size[10];   /* size in bytes */
};

void table()
{
    FILE *stream;
    char str[sizeof(struct ar_hdr)];
    struct ar_hdr temp;

    stream = fopen("archive.txt", "r");
    if (stream == 0)
    {
        perror("error");
        exit(0);
    }

    while (fgets(str, sizeof(str), stream) != NULL)
    {
        fscanf(stream, "%[^\t]", temp.ar_name);
        printf("%s\n", temp.ar_name);
    }
    if (feof(stream))
    {
        // hit end of file
        printf("End of file reached\n");
    }
    else
    {
        // other error interrupted the read
        printf("Error: feed interrupted unexpectedly\n");
    }

    fclose(stream);
}

此时,我只希望能够正确读取数据。完成后,我将努力寻找下一个文件。然而,我想重申我的观点,我不是在要求明确的代码——我需要学习这些东西,而让别人为我提供工作代码不会那样做。

4

1 回答 1

3

您已经定义了一个char名为的缓冲区str来保存您的数据,但您正在从一个ar_hdr名为temp. 同样,您正在将二进制数据作为字符串读取,该字符串会因嵌入的空值而中断。

您需要读取二进制数据并更改temp为指针str或直接temp使用以下内容读取:

ret=fread(&temp,sizeof(temp),1,stream);

(看看 doco 的 fread - 我的 C 太生锈了,无法确定)。确保检查并使用返回值。

于 2013-02-04T20:18:09.030 回答