0

私は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)

4

1 に答える 1

4

終了文字の前にasctimeあるC文字列を生成するためです。こちらのリファレンスをご覧ください。\nNUL

文字列の後には、改行文字('\ n')と終了ヌル文字が続きます。

于 2013-02-02T04:18:49.527 に答える