在C中预填充stdin

时间:2017-11-21 13:31:06

标签: c printf stdin

我的程序应该让用户编辑一行文件。用户编辑该行并按Enter键将其发回。因此,我想打印即将被编辑的当前行,但是在stdin而不是stdout上打印它。 我不知道如何解决的唯一问题是我如何预先填充标准输入。我已经尝试过了:

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

这似乎是最简单的解决方案,但可能太简单了。 fprintf不会向stdin打印任何内容。什么是正确的方法?

编辑: Result

它应该是这样的。请注意可以移动的光标。

3 个答案:

答案 0 :(得分:3)

C语言没有终端或行版本的概念,因此无法以便携方式完成。您可以依靠像[n] curses这样的库来获得几乎可移植的解决方案,或者如果您只需要在一个操作系统上使用低级操作系统原语。

例如,在Windows上,您可以通过在读取之前将键击模拟到适当的窗口(例如通过发送WM_CHAR消息)来提供输入缓冲区,但这将非常不可移植 - 并且最终不再是C但是Windows解决方案......

答案 1 :(得分:1)

首先,您需要libreadline 开发人员包。 (如果您的系统上尚未提供libreadline,则可能还需要{/ 1}}

在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);

提示用户&#34;行:&#34;,并且必须执行向上箭头来获取和编辑历史记录,即cprefill行。

请注意,您必须使用-lreadline

进行编译/链接

readline打印作为参数给出的提示,然后等待用户交互,允许行编辑,并使用箭头加载存储在历史记录中的行。

然后释放char *返回的readline(因为该函数使用malloc()分配缓冲区。)

答案 2 :(得分:0)

您可以使用GNU Readline。它会在启动时调用rl_startup_hook指向的函数,在这里我们使用rl_insert_text将文本放入行缓冲区。

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

int prefill(void)
{
    rl_insert_text("You may edit this line");

    return 0;
}

int main(void)
{
    char *cbuffer;

    puts("Please edit the following line");
    rl_startup_hook = prefill;
    if ((cbuffer = readline(NULL)) == NULL) /* if the user sends EOF, readline will return NULL */
        return 1;
    printf("You entered: %s\n", cbuffer);
    free(cbuffer);

    return 0;
}

有关更多信息,请参见GNU Readline manual