我正在开发一个可以读取 unix 归档文件内容的 C 程序。我有一个有趣的错误,也许我不明白,所以我想我会在这里问。
在我看来,存档 c.txt 的文件大小减少了 1。可能是因为双重回报。以下是在 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 的文件名是 \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);
}