-2

使用 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 时才会停止,然后返回我阅读了多少个字符。

4

3 回答 3

1

听起来您需要研究非缓冲输入。该站点建议使用 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)。

于 2013-02-15T17:08:17.847 回答
1

当与终端、套接字或管道等数据源一起使用时,read一旦有一些数据准备好就返回。终端驱动程序通常会逐行提供数据,这就是您的程序得到的。

如果要读取特定数量的数据,或者读取所有数据直到满足特定条件,则必须循环执行。

于 2013-02-15T17:14:31.350 回答
0
int c;
while((c = getchar()) != EOF) {
   /*do something*/
}
于 2013-02-15T19:07:13.233 回答