c - printf 在格式字符串中添加一个\n

标签 c printf fseek

我正在尝试用 C 构建 ar unix 命令的一个版本。我正在处理详细的输出,并且我已经涵盖了其中的大部分内容。但是,当我通读文件并将文件名放入格式字符串时,一个 secret 的新行不断弹出。

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 个字节,它就会开始切断名称,所以我认为不是这样。

此外,奖金,如果有人知道一种方法可以轻松地将八进制转换为 unix 文件权限,我会很兴奋(即 -rw-rw-rw)

最佳答案

因为 asctime 生成的 C 字符串在 NUL 终止字符之前有 \n。查看引用 here .

The string is followed by a new-line character ('\n') and the terminating null-character.

关于c - printf 在格式字符串中添加一个\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14658508/

相关文章:

c - 字符串存在,但未打印

c - 在这种情况下 malloc 是如何工作的?

c - 在C中,fwrite()'s "size_t size"和 "size_t n items"混淆

c - 如何一次将数组中的数字复制到二进制文件中?

c - 为什么 fread() 给出看似随机的数据?

java - C 中的 Sizeof 移植到 Java

linux - fseek char linux 设备

c - Uart 16c950 linux 速度高于 B4000000 (4Mbps)

c - C 中的数字相乘

bash - 使用 bash printf 减少小数位数而不四舍五入