使用系统调用读取C,
#include <unistd.h>
int main()
{
char data[128];
while(read(0, data, 128) == 0){
read = read(0, data, 128)+ read //counting the amount of chars read in
}
exit(0);
}
我希望输入在ctrl + d上终止,这样用户可以按Enter键,它只会转到新行。现在它没有那样运作。
Read返回一个整数,表示它读取的字节数。一旦用户按下ctrl + d,我将如何停止阅读,换句话说,您可以在按Enter键的同时继续阅读,但仅在按下ctrl + d时停止,然后返回我读取的字符数。
答案 0 :(得分:1)
听起来你需要研究非缓冲输入。 This site建议使用termios函数禁用规范(缓冲)输入。这是我用他们提供的示例代码编写的内容。这将允许用户输入文本,直到读取Ctrl-D信号(0x40),此时它将输出读取的字节数。
#include <unistd.h>
#include <termios.h>
void print_int(int num);
int main()
{
struct termios old_tio, new_tio;
unsigned char c;
/* get the terminal settings for stdin */
tcgetattr(STDIN_FILENO, &old_tio);
/* we want to keep the old setting to restore them a the end */
new_tio = old_tio;
/* disable canonical mode (buffered i/o) and local echo */
new_tio.c_lflag &=(~ICANON & ~ECHOCTL);
/* set the new settings immediately */
tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
char buf[128] = {0};
int curr = read(STDIN_FILENO, buf, 128);
int nbyte = curr;
while (curr && buf[0] != 0x04) {
curr = read(STDIN_FILENO, buf, 128);
nbyte += curr;
}
/* restore the former settings */
tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
write(STDOUT_FILENO, "Total bytes: ", 13);
print_int(nbyte);
write(STDOUT_FILENO, "\n", 1);
return 0;
}
void print_int(int num) {
char temp[16];
int i = 0, max;
while (num > 0) {
temp[i++] = '0'+(num % 10);
num /= 10;
}
max = i;
for (i=(max-1); i>=0; i--) {
write(STDOUT_FILENO, &temp[i], 1);
}
}
请注意,在他们的示例代码中,他们使用~ECHO
,但我假设您希望在键入时看到输入,因此~ECHOCTL
将仅禁用回显控制字符(例如,^ D在输入结束时。)
答案 1 :(得分:1)
当与数据源(如终端,套接字或管道)一起使用时,read
会在某些数据就绪后立即返回。终端驱动程序通常会逐行提供数据,这就是您的程序所能获得的。
如果您想要读取特定数量的数据,或者在满足特定条件之前读取所有数据,则必须循环执行。
答案 2 :(得分:0)
int c;
while((c = getchar()) != EOF) {
/*do something*/
}