在系统调用中使用`\ r`字符进行write(2)

时间:2018-08-17 18:33:31

标签: c

我正在尝试在终端上打印数字。数字必须打印在同一位置。因此,应先打印1,然后再删除1,然后打印2,依此类推。我正在使用以下C代码:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    useconds_t milisecs;
    milisecs = 500000;
    int i;
    char buffer[1024];

    /* print numbers in-place */
    for (i=0;i<10;i++) {
        printf("%d\r",i);
        fflush(stdout);
        usleep(milisecs);
    }

    /* print numbers in-place using write() */
    for (i=0;i<10;i++) {
        snprintf(buffer, sizeof(buffer), "%d\r", i);
        write(1,buffer,1);
        usleep(milisecs);
    }

    return 0;
}

第一个for循环使用printf()并按我的预期工作。但是,第二个带有write()的循环将打印0123456789。如何获得第二个循环以输出与第一个循环相同的文本?我认为问题与\r无法识别write()有关。

2 个答案:

答案 0 :(得分:5)

write(1,buffer,1);

仅将一个字符写入stdout。字符串中的第一位数字。

你想要

write(1,buffer,strlen(buffer));

答案 1 :(得分:2)

缓冲区包含数字和CR(两个字符),但是您只写一个字符。您可以使用strlen()来确定结果字符串的长度,但是snprintf()已经返回了该长度,因此使用该值更有效:

    int len = snprintf( buffer, sizeof(buffer), "%d\r", i ) ;
    write( STDOUT_FILENO, buffer, len ) ;

    write( STDOUT_FILENO, buffer, 
           snprintf( buffer, sizeof(buffer), "%d\r", i ) ) ;