我正在开发一个可以读取unix存档文件内容的C程序。我有一个有趣的错误,也许我不明白,所以我想我会在这里问。
在我看来,存档c.txt的文件大小是一个。可能是因为双重回报。以下是在nano中打开时存档文件的内容:
!<arch>
b.txt 1359332639 502 20 100644 28 `
Appending B. shortb long b
c.txt 1359332646 502 20 100644 17 `
COpy this shit.
d.txt 1359332655 502 20 100644 28 `
Appending D. shortb long b
文件大小列为17,但只能将我带到d.txt之前的\ n。结果是,当我使用文件大小的fseek扫描文件列表时,我最终崩溃了d.txt
下面是C中-t的代码。这不会崩溃,但d.txt的file_name会将其作为\ nd.txt
当我尝试创建详细版本时,我真的因此错误而搁浅。
我想知道在处理文件时是否存在我做错的事情,或者是否存在我没有得到的其他细微差别。
void table(char *archive){
printf("\nI'm in -t!\n");
size_t readNum;
long long arch_size, file_size;
char header[60];
FILE *fp = fopen(archive, "r");
if (!fp)
fail('f');
//get file size
fseek(fp, 0, SEEK_END);
arch_size = ftell(fp);
rewind(fp);
//move over ARMAG
if(fseek(fp, strlen(ARMAG), SEEK_SET) != 0)
fail ('z');
//loop over files
while(ftell(fp) < arch_size -1){
//reads header into
readNum = fread(header, 1, sizeof(header), fp);
if(readNum != sizeof(header))
fail('r');
printf("%.*s\n", 16, header);
file_size = atoll(&header[48]);
//move over file
if(fseek(fp, file_size, SEEK_CUR) != 0)
fail ('z');
}
fclose(fp);
}