-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 に答える