文件IO似乎没有正确读取

时间:2013-02-04 20:14:40

标签: c io ar

免责声明:这是作业。我不是要求明确的代码。相反,我只是要求足够的帮助,以便我理解我的问题并自行纠正。

我正在尝试根据家庭作业重新创建Unix ar实用程序。这个任务的大部分处理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);
}

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

1 个答案:

答案 0 :(得分:3)

您已定义了一个名为char的{​​{1}}缓冲区来保存您的数据,但您正在从名为str的单独内存ar_hdr结构中访问它。同样,您正在读取二进制数据作为字符串,因为嵌入的空值而会中断。

您需要将其读作二进制数据,并将temp更改为temp的指针,或使用以下内容直接读入str

temp

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