предварительно заполнить стандартный ввод в C

Моя программа должна позволять пользователю редактировать строку файла. Пользователь редактирует строку и отправляет ее обратно, нажав клавишу ввода. Поэтому я хотел бы напечатать текущую строку, которая должна быть отредактирована, но печатать ее на stdin вместо stdout. Единственная проблема, которую я не знаю, как решить, это то, как я могу заполнить стандартный ввод. Я уже пробовал это:

char cprefill[] = {"You may edit this line"};
char cbuffer[100];
fprintf(stdin, cprefill);
fgets(cbuffer, 100, stdin);

Это кажется самым простым решением, но, вероятно, слишком простым для работы. Fprintf ничего не печатает на стандартный вывод. Какой правильный путь?

Изменить: Результат

Вот как это должно выглядеть. Пожалуйста, обратите внимание на курсор, который можно перемещать.

4 голоса | спросил Duval 21 22017vEurope/Moscow11bEurope/MoscowTue, 21 Nov 2017 16:31:05 +0300 2017, 16:31:05

2 ответа


0

Для начала вам нужен пакет libreadline developer . (Вам также может понадобиться libreadline, если он еще не доступен в вашей системе)

В Debian /Ubuntu это apt install libreadline-dev (плюс libreadline6 если вам нужны также двоичные файлы - 6 может отличаться на вашей платформе)

Затем вы можете добавить историю в readline, например так

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>    

...

char cprefill[] = {"You may edit this line"};

add_history(cprefill);

char *buf = readline("Line: ");

printf("Edited line is %s\n", buf);

// free the line allocated by readline
free(buf);

Пользователю предлагается «Строка:», и он должен сделать СТРЕЛКУ ВВЕРХ , чтобы получить и отредактировать историю, т.е. - строка.

Обратите внимание, что вы должны скомпилировать /связать с cprefill

-lreadline печатает подсказку, заданную в качестве аргумента, затем ожидает взаимодействия с пользователем, позволяет редактировать строки и стрелки для загрузки строк, хранящихся в история.

readline, возвращаемое char * затем должен быть освобожден (поскольку эта функция выделяет буфер с readline).

ответил Ring Ø 21 22017vEurope/Moscow11bEurope/MoscowTue, 21 Nov 2017 16:34:56 +0300 2017, 16:34:56
0

Язык C не имеет понятия ни терминального, ни линейного издания, поэтому это нельзя сделать переносимым способом. Вы можете либо использовать библиотеку, подобную [n] curses, чтобы получить почти переносимое решение, либо, если вам нужно только, чтобы в одной единственной ОС использовались низкоуровневые примитивы ОС.

Например, в Windows вы могли бы заполнить входной буфер, имитируя нажатия клавиш в соответствующее окно (например, отправляя сообщения WM_CHAR) непосредственно перед чтением, но это было бы крайне непереносимо - и в конце концов больше не является С, но решение для Windows ...

ответил Serge Ballesta 21 22017vEurope/Moscow11bEurope/MoscowTue, 21 Nov 2017 17:13:57 +0300 2017, 17:13:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132