私はCでarunixコマンドのバージョンを構築しようとしています。私は冗長な出力に取り組んでおり、そのほとんどをカバーしています。ただし、ファイルを読み、ファイル名をフォーマット文字列に入れると、秘密の改行がポップアップし続けます。
void verbose(char *archive){
printf("\nI'm in -v!\n");
int mode;
size_t readNum;
time_t mtime;
struct tm * time_box;
long long arch_size, file_size;
long uID, gID;
char header[60], file_name[16];
char* tokens;
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');
tokens = strtok(header, " ");
strcpy(file_name, tokens);
mtime = (time_t)(atol(tokens = strtok(NULL, " ")));
uID = atol(tokens = strtok(NULL, " "));
gID = atol(tokens = strtok(NULL, " "));
mode = atoi(tokens = strtok(NULL, " "));
file_size = atoll(&header[48]);
time_box = localtime(&mtime);
printf("%d"
"\t%ld"
"/%ld"
"\t\t%lld "
"%s "
"%s\n", mode, uID, gID, file_size, &asctime(time_box)[4], file_name);
//move over file
if(fseek(fp, file_size, SEEK_CUR) != 0)
fail ('z');
}
fclose(fp);
}
void delete(){
printf("\nI'm in -d!\n");
}
このコードは、次のような出力を生成します。
I'm in -v!
100644 502/20 28 Jan 27 16:23:59 2013
b.txt
100644 502/20 17 Jan 27 16:24:06 2013
c.txt
100644 502/20 28 Jan 27 16:24:15 2013
d.txt
100644 502/20 17 Jan 27 16:24:06 2013
c.txt
ファイル名が新しい行にある理由がわかりません。それは私を殺しています。きちんとシークしていないのではないかと思いましたが、シークを1バイト上げると名前が途切れてしまうので、そうは思いません。
また、ボーナスとして、その8進数をUNIXファイルのパーミッションに簡単に変換する方法を誰かが知っているとしたら、私はうれしくなります(つまり、-rw-rw-rw)