【问题标题】:File IO does not appear to be reading correctly文件 IO 似乎没有正确读取
【发布时间】:2013-02-04 20:14:39
【问题描述】:

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

我正在尝试根据家庭作业重新创建 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 以减轻对所有“关于家庭作业的废话”cmets 的需求的写作方式。

标签: c io unix-ar


【解决方案1】:

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

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

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

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

【讨论】:

  • 认为他试图将整个标头读入str,然后将其中的数据提取到他的temp 结构中?
  • @Brian:可能;我正在努力给他需要的指点。
  • @SoftwareMonkey:Brian 是对的,这是我的意图。我会再对那个人进行一次攻击,看看我需要做出什么改变。我没有考虑过嵌入空值的可能性。我打算使用 fseek() 跳过除标头信息之外的所有内容,所以除非其中嵌入了一个空值,这将是一个严重的问题,否则遇到嵌入的空值应该不是问题,对吧?
  • 二进制标头中的空值几乎可以保证。例如,第一个压缩文件的 4 字节整数二进制偏移量可能为 0x0000nnnn,文件名可能以 null 结尾,等等。
  • @SoftwareMonkey 很高兴知道 - 谢谢!我的阅读材料中没有涉及这些内容,并且明确要求我在课堂材料之外查找信息。所以谢谢你的指点——希望我能从中有所作为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多