2013-02-04 52 views
5

免责声明:这是作业。我没有要求明确的代码。相反,我只要求足够的帮助,以便我可以理解我的问题并自己改正。文件IO看起来没有正确读取

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

在这个实例中,我打算创建一个存档中所有文件的简单列表。你可能会注意到,我还没有走得很远。该计划相对简单:从档案文件中读取每个文件标题,并仅打印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); 
} 

在这一点上,我只想能够正确读取数据。在完成之后,我将努力寻找下一个文件。然而,我想重申一下我的观点,即我并没有要求明确的代码 - 我需要学习这些东西,让某人给我提供工作代码不会那样做。

+2

+1的写作方式可以减轻所有关于作业的“无庸质疑”的评论。 – ChiefTwoPencils

回答

3

您已经定义了一个名为str握住你的数据char缓冲区,但你是从一个名为temp一个单独的内存ar_hdr结构访问它。同样,你正在读取二进制数据作为一个字符串,由于嵌入的空值而被破坏。

您需要阅读的二进制数据,要么改变temp是一个指针str或使用类似直接读入temp

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

(看DOCO的FREAD - 我的C太生疏以确保这一点)。确保你检查并使用返回值。

+1

我*想*他正在尝试将整个头部读入'str',然后将数据从那个拉入他的'temp'结构中? –

+1

@Brian:可能;我想给他他需要的指针。 –

+0

@SoftwareMonkey:Brian是对的,那是我的意图。我会再试一次,看看我需要做些什么改变。我没有考虑过嵌入式空值的可能性。我打算使用fseek()来跳过除标题信息之外的所有内容,因此除非嵌入了null值,这是一个严重的问题,否则嵌入的null值不应该成为问题,对吗? – idigyourpast

相关问题