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 の 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);
}