Итак, я хотел создать программу, которая принимает ввод от stdin
через перенаправление или интерактивный ввод. getline
может обеспечить чтение в обратном направлении, но я хотел бы иметь все приятные функции readline
для интерактивного ввода. Цель программы - манипулировать текстом через язык и выводить результаты на стандартный вывод (аналогично тому, что делает sed). Проблема в том, что я не могу сделать my_prog > output.txt
с readline
, потому что все, что было введено в readline
, вывод readline попадает в этот файл, и я даже не вижу его. В настоящее время у меня есть обходной путь, когда я просто отправляю вывод readline
в stderr
, используя rl_outstream
. Это дает мне поведение, которое я ищу, но похоже на хак, когда, возможно, есть более простое решение. Хороший пример того, что я ищу, это то, что делает Python.
python > output.txt
>>> print 'hello'
>>> exit()
cat output.txt
hello
Вот код, демонстрирующий, что я делаю ...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "readline/readline.h"
int main(int argc, char** argv)
{
char* from_stdin = malloc(512);
char* line = NULL;
rl_outstream = stderr;
if(isatty(STDIN_FILENO)) {
do {
line = readline("");
if(line) {
strcat(from_stdin, line);
strcat(from_stdin, "\n");
} else {
break;
}
} while(1);
} else {
size_t n = 0;
while(getline(&line, &n, stdin) != -1)
strcat(from_stdin, line);
}
puts(from_stdin);
}
Патч для принятого решения:
--rl_outstream = stderr;
++FILE* more_hacky = fopen("/dev/tty", "w");
++rl_outstream = more_hacky;
Я согласен с тем, что он более хакерский. Вероятно, я оставлю свой код как есть, но это сделает stderr более «чистым» для ошибок, если я выберу.