2016-11-08 2 views
-1

Редактировать: Я упростил исходный код.тот же код, другой порядок печати с printf() и write() в разных компиляторах C

Код:

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

int  main(void) 
{ 

    printf("printf1\n"); 
    write(1, "1 should be after printf\n", 25); 

    printf("printf2\n"); 
    write(1, "2 should be after printf\n", 25); 

    return 0; 
} 

Неожиданный результат на Ideone:

1 should be after printf 
2 should be after printf 
printf1 
printf2 

Ожидаемый результат на cs50

printf1 
1 should be after printf 
printf2 
2 should be after printf 

Почему порядок вывода отличается?

+5

вы не промывке выводятся после printfs. когда он вспыхнет, зависит от ОС. См. [This] (/ questions/1716296/why-does-printf-not-flush-after-the-call-except-a-newline-is-in-the-format-strin) – Tibrogargan

+0

@ Тиброгарган Спасибо! Вы указываете меня в правильном направлении. – rldyjb

ответ

0

Здесь printf ожидает, что буфер будет заполнен, а запись не сделает этого. Если у вас есть символ \ n (новый символ строки) в конце вашего printf, тогда он будет вызывать запись, как только он встретит \ n. Обратите внимание, что печать также вызывает запись после заполнения буфера. write будет просто выводить заданное количество байтов в терминал, поэтому будет быстрее.

попробовать свой код, как:

printf("i = %d\n", i); 
ft_putstr("should be printed right after printf\n"); 
+0

Я пробовал код с \ n, добавленным в printf, но содержимое ft_putstr() все еще встречается перед printf(). Вы можете увидеть результат на http://ideone.com/zGacCM – rldyjb

+0

Я попробовал это на своей локальной машине. Он работает так, как ожидалось. Благодаря! – rldyjb

+0

printf ("i =% d \ n", i); fflush (stdout); ft_putstr («следует печатать сразу после printf \ n»); это также будет работать нормально. просто очистите буфер. –