Ответ 1
По-видимому, это известная ошибка Eclipse. Эта ошибка разрешена с разрешением WONT-FIX. Однако я понятия не имею, почему. Ссылка здесь: Ошибка Eclipse C Console.
Начало работы на языке C. Я использую eclipse (juno) как свою IDE и установленный плагин CDT. Я также распаковал mingw64 (компилятор GCC). Я написал очень простую программу, чтобы узнать, работает ли она. Это мой код:
#include <stdio.h>
int main()
{
int age;
printf("Hello, please enter your age:\n");
scanf("%d", &age);
printf("Your age is %d", age);
return 0;
}
Проблема заключается в том, что выходной буфер заполняется строковым значением первого printf
, но не выводит его на консоль. Мне нужно ввести число, и только тогда буфер заливает все данные в консоль, поэтому я вижу консоль примерно так:
1
Hello, please enter your age:
Your age is 1
вместо ожидаемого:
Hello, please enter your age:
1
Your age is 1
Теперь я обнаружил, что я могу использовать fflush(stdout)
после первого printf
, но я не думаю, что это решение элегантно и даже необходимо. Любые идеи о том, как я могу это преодолеть?
EDIT - потому что я изучаю это в своем университете, я не могу использовать что-либо, что не было изучено в курсе, поэтому я могу использовать printf
и scanf
НОВЫЙ РЕДАКТ.. Думаю, я нашел для этого объяснение. Как я уже сказал, я выводил на консольный просмотр внутри Eclipse. Странно то, что, если я компилирую и запускаю программу из командной строки Windows, я получаю желаемый результат. Поэтому я думаю, что eclipse фактически записывает вывод в файл и представляет его в окне консоли. Как заставить eclipse открыть окно реальной командной строки в моих конфигурациях запуска?
По-видимому, это известная ошибка Eclipse. Эта ошибка разрешена с разрешением WONT-FIX. Однако я понятия не имею, почему. Ссылка здесь: Ошибка Eclipse C Console.
Вывод буферизуется.
stdout по умолчанию используется для буферизации по строке, что означает, что '\n' предполагается сбросить буфер. Почему это не происходит в вашем случае? Не знаю. Вам нужно больше информации о вашем приложении/среде.
Однако вы можете управлять буферизацией с помощью setvbuf():
setvbuf(stdout, NULL, _IOLBF, 0);
Это приведет к тому, что stdout будет буферизироваться по строке.
setvbuf(stdout, NULL, _IONBF, 0);
Это заставит stdout быть небуферизованным, поэтому вам не нужно будет использовать fflush(). Обратите внимание, что это сильно повлияет на производительность приложения, если у вас много отпечатков.
Попробуйте установить это перед печатью:
setvbuf (stdout, NULL, _IONBF, 0);
Вы можете попробовать написать stderr, а не stdout.
fprintf(stderr, "Hello, please enter your age\n");
Вы также должны взглянуть на этот соответствующий поток.
Как указывали другие, вывод может быть буферизирован внутри вашей программы, прежде чем консоль или оболочка смогут увидеть ее.
В unix-подобных системах, включая macs, stdout
по умолчанию использует буферизацию на основе строки. Это означает, что ваша программа опустошает свой буфер stdout
, как только увидит новую строку.
Однако в окнах новые строки больше не являются специальными, и используется полная буферизация. Windows вообще не поддерживает буферизацию строк; см. страницу msdn на setvbuf.
Итак, в окнах хороший подход - полностью отключить буферизацию stdout
следующим образом:
setvbuf (stdout, NULL, _IONBF, 0);
После создания проекта щелкните правой кнопкой мыши проект Debug > "Debug Configurations", как показано ниже
На вкладке "отладчик" убедитесь, что "командный файл GDB" теперь указывает на ваш файл ".gdbinit". Else, введите путь к вашему конфигурационному файлу .gdbinit:
Нажмите "Применить" и "Отладить". Командная строка DOS должна быть запущена, как показано ниже.
Добавьте переменную среды c:\gygwin\bin
в PATH
как переменную системной среды или в проект eclipse (properties- > run/debug- > edit)