C 文件IO似乎没有正确读取

C 文件IO似乎没有正确读取,c,io,unix-ar,C,Io,Unix Ar,免责声明:这是一项任务。我不是在要求明确的代码。相反,我只需要寻求足够的帮助,以便我能够理解我的问题并自己纠正它。 我正在尝试根据家庭作业重新创建Unixar实用程序。本任务的大部分处理C中的文件IO,其他部分处理系统调用等 在本例中,我打算创建存档中所有文件的简单列表。你可能会注意到,我还没走多远。计划相对简单:从存档文件中读取每个文件头,只打印ar\u hdr.ar\u name中保存的值。其余字段将通过fseek()跳过,包括文件数据,直到到达另一个文件为止,此时流程再次开始。如果达到EO

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

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

在本例中,我打算创建存档中所有文件的简单列表。你可能会注意到,我还没走多远。计划相对简单:从存档文件中读取每个文件头,只打印
ar\u hdr.ar\u 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);
}

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

您已经定义了一个名为
str
char
缓冲区来保存数据,但您是从名为
temp
的单独内存
ar\u hdr
结构访问它的。此外,您正在以字符串形式读取二进制数据,该字符串将由于嵌入的空值而中断

您需要以二进制数据的形式读取,或者将
temp
更改为指向
str
的指针,或者使用以下方法直接读取
temp

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

(看弗雷德的文件——我的C太生锈了,不能确定这一点)。确保您检查并使用返回值。

+1用于以一种减轻对所有“关于家庭作业的废话”注释需求的方式编写。我认为他试图将整个标题读入
str
,然后将其中的数据拉入他的
temp
结构?@Brian:可能;“我正试着给他他所需要的指示。”猴子:布莱恩是对的,那是我的意图。我会为弗雷德再尝试一次,看看我需要做些什么改变。我没有考虑过嵌入空值的可能性。我打算使用fseek()跳过头信息以外的所有内容,因此,除非其中嵌入了null值(这将是一个严重的问题),否则运行嵌入的null应该不会是问题,对吧?二进制头中的null几乎是有保证的。例如,第一个压缩文件的4字节整数二进制偏移量可能为0x0000nnnn,文件名可能以null结尾,等等@SoftwareMonkey这很好,谢谢!我的阅读材料中没有涉及这些内容,我被明确要求查找课堂材料之外的信息。所以谢谢你的指点,希望我能从中有所收获。