2
/*
Low Level I/O - Read and Write
Chapter 8 - The C Programming Language - K&R
Header file in the original code is "syscalls.h"
Also BUFSIZ is supposed to be defined in the same header file   
*/

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

#define BUFSIZ 1

int main()  /* copy input to output */
{
    char buf[BUFSIZ];
    int n;

    while ((n = read(0, buf, BUFSIZ)) > 0)
        write(1, buf, n);

    return 0;
}

入力として「∂∑∑®†¥¥¥˚π∆˜˜∫∫√ç tu 886661~EOF」を入力すると、同じものがコピーされます。同時に格納される非 ASCII 文字の数は?

BUFSIZ は、転送されるバイト数です。入力から出力に何かをコピーできる場合、BUFSIZ はどのようにバイト転送を制限しますか?

char buf[BUFSIZ] はどのように非 ASCII 文字を格納していますか?

4

3 に答える 3

3

EOF まで少しずつ読み取ります。

while ((n = read(0, buf, BUFSIZ)) > 0)

それが理由です。文字通り、バイトごとに、入力を出力にコピーします。それをユニコードに戻す方法は、コンソールの問題であり、あなたの問題ではありません。たぶん、データをシンボルとして認識できるようになるまで何も出力しません。

于 2012-07-29T07:44:19.393 に答える
0

エラーが発生して「ファイルの終わり」に達するまでループで read を呼び出しているため、read を呼び出すたびに buf で正確に 1 文字を取得しています。その後、その文字は書き込みシステムコールを介して出力されます。read システム コールは、最後の引数で指定された数以上は読み取らないことが保証されています。たとえば、あなたのケースで 10 を渡すと、 read は先に進み、読み取ったデータを配列の境界を超えてコピーしようとします。

あなたが供給した文字に関しては、これらは拡張ASCII文字(コード128-255)であるように見えるので、ここでは問題ありません。

于 2012-07-29T07:48:46.730 に答える
0

標準入力から read を呼び出すと、端末または別のプログラムにバインドされたパイプから読み取られます。もちろん、ライター (端末または他のプログラム) とプログラムの間にバッファーがあります。このバッファーがアンダーフローの場合、リーダー (プログラム) は読み取りをブロックしています。書き込み時のブロッキングでバッファがライター(端末など)よりオーバーフローした場合、またはその逆の場合。

標準出力に書き込むと、パイプに書き込まれ、端末または別のプログラムにバインドされます。

したがって、プログラムが端末からシェルによって実行される場合、プログラムの入力と出力は (疑似) 端末にバインドされます。(疑似) 端末は、ユーザーが押したキーを文字に変換し、エンコードされた文字列 (ISO8859-1、UTF-8 など) を画面上の記号に変換できるプログラムです。

  1. EOL の EOF を押す前に、端末プログラムに文字が格納されます。これは端末の標準モードです。プレス入力後、プログラムにバインドされたパイプにバイトが書き込まれます。
  2. BUFSIZ は、1 回の操作で入力から読み取ろうとするバイト数です。n戻り値は、操作が完了したときに実際に読み取られたバイト数です。したがって、BUFSIZ は、プログラムがパイプから読み取ることができる最大バイト数です。
  3. char buf[BUFSIZ] はバイトの配列 (一部の文字セットの文字ではない) であるため、任意の値 (印刷不能やゼロを含む) を処理できます。
于 2012-07-29T08:26:20.543 に答える