web-dev-qa-db-ja.com

stdinからの読み取り

Unixでread()システムコールを使用してユーザー入力を読み取るための可能な方法は何ですか。 read()を使用して標準入力からバイト単位で読み取るにはどうすればよいですか?

28
Bunny Bunny

10バイトを読み取るには、次のようなことを実行できます。

char buffer[10];
read(STDIN_FILENO, buffer, 10);

read() は、文字列にするために'\0'を追加して終了しません(生のバッファを与えるだけです)。

一度に1バイトを読み取るには:

char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
 //do stuff
}

このファイルでマクロとして定義されている#include <unistd.h>STDIN_FILENOを忘れないでください。

3つの標準ストリームに対応する3つの標準POSIXファイル記述子があり、おそらくすべてのプロセスが次のことを期待するはずです。

Integer value   Name
       0        Standard input (stdin)
       1        Standard output (stdout)
       2        Standard error (stderr)

したがって、代わりにSTDIN_FILENO 0を使用できます。

編集:
Linuxシステムでは、次のコマンドを使用してこれを見つけることができます。

$ Sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define'
/usr/include/unistd.h:#define   STDIN_FILENO    0   /* Standard input.  */

コメント/* Standard input. */に注意してください

30
Johnny Mnemonic

man read から:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

入力パラメーター:

  • int fdファイル記述子は整数であり、ファイルポインターではありません。 stdinのファイル記述子は0

  • void *bufread関数によって読み取られた文字を格納するバッファへのポインタ

  • size_t count読み取る最大文字数

したがって、次のコードを使用して文字ごとに読み取ることができます。

char buf[1];

while(read(0, buf, sizeof(buf))>0) {
   // read() here read from stdin charachter by character
   // the buf[0] contains the character got by read()
   ....
}
7
MOHAMED