Unixでread()
システムコールを使用してユーザー入力を読み取るための可能な方法は何ですか。 read()
を使用して標準入力からバイト単位で読み取るにはどうすればよいですか?
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. */
に注意してください
man read から:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
入力パラメーター:
int fd
ファイル記述子は整数であり、ファイルポインターではありません。 stdin
のファイル記述子は0
void *buf
read
関数によって読み取られた文字を格納するバッファへのポインタ
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()
....
}