Порядок вывода консоли плагина Nppexec обратный - PullRequest
0 голосов
/ 31 мая 2019

Я добавил ярлык компилятора в notepad ++, используя nppexec.Но это консоль работает немного странно.Это всегда приоритетные функции, которые требуют ввода.

например:

printf("First input:\n");
scanf("%d", &a);
printf("You typed %d");

Консоль должна вывести «Первый ввод» и получить мой ввод, а также «Вы набрали (ввод)»

Но вместо этого всегда требуется, чтобы я сначала набрал все входные данные для scanfs.

Таким образом, журнал консоли выглядит так:

3
First input:
You typed 3

Скомпилировано.exe файл работает в правильном порядке, но это немного раздражает.

Кто-нибудь знает решение для исправления этого порядка вывода консоли?

Кстати,

printf("First input:\n");
scanf("%d", &a);
printf("Second input:\n");
scanf("%d", &b);
printf("%d, %d", a, b);

Консольный журнал этого кода

1
2
First input:
Second input
1,2

1 Ответ

0 голосов
/ 03 июня 2019

Пожалуйста, добавьте fflush(stdout); после каждого printf.К сожалению, это не изменилось в реализации каналов в Windows на протяжении многих лет ...

Как сказано в руководстве NppExec (раздел "4.5. Перенаправление вывода на консоль"):

NppExec использует каналы для перенаправления вывода дочернего процесса в окно консоли NppExec и для перенаправления ввода пользователя из окна консоли NppExec на ввод дочернего процесса.Такой подход имеет несколько известных ограничений:

  • вывод не может быть показан до завершения дочернего процесса (если этот дочерний процесс выполняет много операций без явной очистки его вывода);

  • вывод невозможен, пока дочерний процесс ожидает начального ввода (это может случиться с некоторыми интерпретаторами, но не происходит с cmd.exe);

Также в руководстве NppExec сказано (раздел «4.8.2. Дополнительные сценарии»):

printf («% d \ n», i);

fflush (стандартный вывод);// важный!в противном случае вывод может быть буферизован внутри канала

Комментарий о возможной буферизации внутри канала относится к NppExec - потому что NppExec использует каналы для перенаправления вывода и ввода консольного процесса.Как я уже говорил, и я все еще заявляю, что эта «функция» буферизации в каналах - это не то, что NppExec внедряет или неправильно обрабатывает - это основная «функция» каналов, как они были реализованы Microsoft.Это известно годами - и до сих пор не исправлено.Поэтому используйте fflush () всякий раз, когда ожидается, что программа будет запущена без реального окна консоли (например, когда она запускается в NppExec).

...