所以,我正在尝试编写ac程序,将输入管道读入程序(通过stdin),但我还需要能够从终端读取输入(所以我显然无法从stdin读取它) 。我该怎么办? 我正在尝试打开/ dev / tty的另一个文件句柄:
int see_more() {
char response;
int rd = open("/dev/tty", O_RDWR);
FILE* reader = fdopen(rd, "r");
while ((response = getc(reader)) != EOF) {
switch (response) {
case 'q':
return 0;
case ' ':
return 1;
case '\n':
return -1;
}
}
}
但这会导致分段错误。
这是适用的版本。感谢大家的帮助:)
int see_more() {
char response;
while (read(2, &response, 1)) {
switch (response) {
case 'q':
return 0;
case ' ':
return 1;
case '\n':
return -1;
}
}
}
答案 0 :(得分:3)
问题是你使用的是单引号而不是双引号:
FILE* reader = fdopen(rd, 'r');
应该是
FILE* reader = fdopen(rd, "r");
以下是fdopen
的原型:
FILE *fdopen(int fildes, const char *mode);
它需要char*
,但您传递char
。
答案 1 :(得分:0)
如果你有另一个管道输入,那么它将用该输入文件替换stdin(终端)。如果您想从终端获取输入,我建议将该文件作为参数而不是管道,然后您可以正常使用stdin。
这是一个例子。
执行:
./a.out foo.txt
代码:
int main(int argc, char* argv[])
{
if (argc >= 2)
{
char* filename = argv[1];
}
else
{
// no filename given
return 1;
}
// open file and read from that instead of using stdin
// use stdin normally later
}