почему write () выполняется перед printf ()?Разве это не якобы последовательное? - PullRequest
0 голосов
/ 14 декабря 2018

это код:

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

void main(){
    char str1[18]= "moo\0 cuek\n";
    printf("lel: %s",str1);

    write(STDOUT_FILENO,str1,18);
    write(STDOUT_FILENO,"meow ",19);

}

и вывод:

moo cuek
meow moo cuek
lel:moo

также, почему сначала печатается meow, а затем moo cuek (вторая строка)

PS когда я помещаю \n в printf как:

printf("lel: %s \n",str1);

Я получаю:

lel:moo
moo cuek
meow moo cuek

Почему ?!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Здесь

printf("lel: %s",str1);

printf() печатает данные в файловом потоке, где его точки и по умолчанию это поток stdout, а поток stdout буферизуется строкой, т.е. вам нужно очистить буфер, вызвавfflush(stdout) или добавление \n char.Например,

printf("lel: %s",str1);
fflush(stdout);

или

printf("lel: %s\n",str1); /* newline char has another use apart from giving newline i.e clear the buffer */

Или вы можете отключить буферизацию, позвонив setbuf().

, находясь здесь

 write(STDOUT_FILENO,str1,18);

write() - это системный вызов, который не является буферизованным IO, то есть он не буферизует данные, следовательно, он немедленно записывает данные в STDOUT_FILENO.

0 голосов
/ 14 декабря 2018

Я не знаю деталей, но в основном большинство функций, которые пишут в консоль, буферизируются.Это означает, что при вызове функции необязательно, когда текст печатается.См .: Почему printf не сбрасывается после вызова, если в строке формата нет новой строки?

...