Почему printf не работает до бесконечного цикла? - PullRequest
2 голосов
/ 22 сентября 2011

Я пытаюсь создать небольшую программу с бесконечным циклом для ожидания ввода сигнала от пользователя.Я хотел распечатать сообщение о текущем рабочем каталоге до начала бесконечного цикла.Сообщение работает само по себе, но когда я помещаю бесконечный цикл в код, сообщение не распечатывается (но терминал выполняет бесконечный цикл).Код:

#include <stdio.h>

int MAX_PATH_LENGTH = 100;

main () {
  char path[MAX_PATH_LENGTH];
  getcwd(path, MAX_PATH_LENGTH);
  printf("%s> ", path);
  while(1) { }
}

Если я достану while(1) { } Я получу вывод:

ad@ubuntu:~/Documents$ ./a.out
/home/ad/Documents>

Почему это?Спасибо!

Ответы [ 5 ]

4 голосов
/ 22 сентября 2011

Когда вы вызываете printf, вывод не распечатывается сразу;вместо этого он уходит в буфер где-то за кулисами.Чтобы заставить его отображаться на экране, вам нужно вызвать fflush или что-то подобное, чтобы очистить поток.Это делается автоматически для вас каждый раз, когда вы печатаете символ новой строки * и когда программа завершается;это второй случай, когда строка удаляется при удалении бесконечного цикла.Но с этим циклом программа никогда не заканчивается, поэтому вывод никогда не сбрасывается на экран, и вы ничего не видите.


* Как я только что обнаружил из прочтения вопроса, его вопрос связан вкомментарий, сброс строки происходит только тогда, когда программа печатает на терминал, и не обязательно, когда она печатает в файл.

2 голосов
/ 22 сентября 2011

Потому что у вас нет символа новой строки в конце вашей строки.stdout по умолчанию с буферизацией строки , что означает, что он не будет сбрасываться в консоль, пока не встретит символ новой строки ('\n') или пока вы явно не сбросите его с помощью fflush().

1 голос
/ 22 сентября 2011

Поскольку выход не очищен.Добавьте

fflush(stdout); 

до того, как цикл while решит проблему.

1 голос
/ 22 сентября 2011

Возможно, выход не очищается.Попробуйте:

printf("%s> ", path);
fflush(stdout);
1 голос
/ 22 сентября 2011

Поскольку стандартный вывод не был очищен.

Вызов

fflush(stdout);

перед вашей петлей.

...