免责声明:这是一项任务.我不是要求明确的代码.相反,我只是要求足够的帮助,我可以理解我的问题,并自己纠正.
我正在尝试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);
}
Run Code Online (Sandbox Code Playgroud)
此时,我只希望能够正确读取数据.在完成之后,我将继续寻找下一个文件.但是,我想重申一下我的观点,即我不是要求明确的代码 - 我需要学习这些东西并且有人向我提供工作代码不会那样做.
您已经定义了一个char名为 的缓冲区str来保存数据,但您是从一个ar_hdr名为 的单独内存结构访问它temp。此外,您将二进制数据作为字符串读取,该字符串会因嵌入的空值而中断。
您需要读取二进制数据,然后更改temp为指针str或直接读取temp使用以下内容:
ret=fread(&temp,sizeof(temp),1,stream);
Run Code Online (Sandbox Code Playgroud)
(看看 doco 的 fread - 我的 C 太生锈了,无法确定这一点)。确保检查并使用返回值。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |