2017-02-25 12 views
0

readシステムコールを使用してunsigned shortを読む必要があります。 the manpageによれば :Cは読み込みシステムコールを使用してバイトをどのように読み込みますか?

リード()buf始まるバッファにファイルディスクリプタfd からcountバイトまで読み取ろう。私の場合は

それは65535までの数値を格納することができますので、しかし、私はこのコードを実行すると、unsigned shortは、2バイトのサイズである:たとえば、コマンドラインで

char buf[2]; 
bytes_read = read(0, buf, 2); 
bytes_wrote = write(1, buf, 2); 

とタイプを、番号123の場合は、12のみを返します。それはバイトを読むのではなく、シンボルですか? 2バイト以上の値を持つ値を2バイトバッファに読み込むにはどうすればよいですか?たとえば、最大値はunsigned shortです。私はK & Rまたはそれに関するマンページには何も見つかりませんでしたので、非常に簡単だと思います。

+0

はい、バイトを読み込みます。 _parse_それらを読んでいない。あなたは最初の2バイトを取得しています。 –

+0

@QPaysTaxesはいターミナルには、多くの異なるシンボルがあります。これはASCIIの解釈のようです! – Tehada

+1

エンコーディングは関係ありません。あなたは '1'、次に' 2'、そして '3'を入力しています。あなたのコードはあなたが書いた最初の2バイトを読み込みます。 0x31の後ろに0x32を続けて数字12として解釈します(便宜上ASCIIを使用します)。 0x31とそれに続く0x32と解釈します。 –

答えて

3

NB:あなたの端末がASCIIまたはUTF8を使用していると仮定しています。この説明のために、それらは同等です。

たとえば、123と入力すると、readは数字として認識されません。これは、一連のバイトとして - 2 - charのバッファを埋めるように見えるので、最初の2バイトが見えます。まず、0x31、次に0x32です。最初のバイトを読み込み、次に2番目のバイトを読み込みます。それを数字に解釈しません。一連のバイトは、ASCIIまたはUTF8としてデコードされたときに数字を表すためにが発生することは無関係です。すべてのCはバイトの実際のシーケンスであり、それがあなたに与えるものです。

も参照してください。第3バイトを参照してください。これは後の入力操作で消費される入力ストリームに残されています。

これが欲しいのなら、素晴らしいです!数字の入力を希望する場合は、fscanfとそれに関連する機能を見てみましょう。

関連する問題