LINUX.ORG.RU

Си печатает строки только с \n в конце


0

0

#include <stdio.h>

int main()
{
printf("1");
sleep(1);
printf("2\n3");
sleep(1);
return 0;
}

Почему печать происходит только когда встречается символ конца строки '\n' или когда закончится программа?

Заранее извеняюсь если это ламерский вопрос - пробовал запускать этот код под окошками - подобной проблемы не возникло. В гугле ничего по данному вопросу не нашёл.

Это очень странно. Скорее всего поможет fflush, но почему так происходит - не понятно.

seiken ★★★★★
()
Ответ на: комментарий от seiken

аналогично, я давно заметил это у себя, но по-моему это не критично - ни разу не приходилось писать без \n в конце

anonymous
()

Это из за особенностей bash-а. Если запускать программу как ./program; echo то проблем не будет. Вкратце bash после выполнения программы ставит символ в начало строки и очищает её, соответственно если перевода строки не было, то будет казаться, что она не печаталась.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Попробовал запустить так ./program; echo - единственное что изменилось - после завершения программы приглашение к вводу напечаталось с новой строчки.

Что интересно, написал аналогичный код на Паскале (использовал компилятор фри паскаль) - всё выводится как надо. Если это особенность bash-а, то как её обходит Паскаль?

program test;
uses crt;

BEGIN
write('1');
delay(1000);
write('2'#10'3');
delay(1000);
END.

LinuxUser ★★★
() автор топика

Потому что stdout по умолчанию line buffered (а stderr - нет).

Сравни поведение твоей программы с

==={{{
#include <stdio.h>

int main()
{
        setvbuf(stdout, NULL, _IONBF, 0);
        printf("1");
        sleep(1);
        printf("2\n3");
        sleep(1);
        return 0;
}
===}}}

или с

==={{{
#include <stdio.h>

int main()
{
        fprintf(stderr, "1");
        sleep(1);
        fprintf(stderr, "2\n3");
        sleep(1);
        return 0;
}
===}}}

Дальше кури man setvbuf.

execve
()
Ответ на: комментарий от anonymous

Нечего тут ржать. То, что сказал Legioner - одна из причин, которая приводит к описанному поведению.

Lego_12239 ★★
()
Ответ на: комментарий от Legioner

bash c нормальным PS1 после завершения программы никуда ничего не ставит и ничего не очищает.

Проверка:

$ echo -ne "123"
123$ 

execve
()
Ответ на: комментарий от execve

Сорри, я жутко ступил. Мой ответ к вопросу не имеет никакого отношения. Естественно там буферизация.

Но у меня bash когда то кстати так делал.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Почему ступил? Как сказал execve, с _нормальными_ настройками такого не будет, но это только с нормальными :-).

Сам недавно с такой проблемой столкнулся. Криво был настроен shell. Я же и setvbuf и printf. Даже как-то внимания не обратил сразу на это. Короче, ерунда, но во внимание принимать тоже надо.

Lego_12239 ★★
()
Ответ на: комментарий от Legioner

Меня сконфузил заголовок топика, соответственно текст сообщения я проглядел по диагонали.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Тьфу!.. Точно.

Обычно стараюсь внимательно читать :-).

Lego_12239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.