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)

这就是为什么。从字面上看,您逐字节地将输入复制到输出。如何将其转换回 unicode 是控制台的问题,而不是您的问题。我猜,它不会输出任何东西,直到它可以将数据识别为符号。

于 2012-07-29T07:44:19.393 回答
0

当您从标准输入调用 read 时,您正在从管道读取,该管道绑定到终端或另一个程序。当然,编写器(终端或其他程序)和您的程序之间有一个缓冲区。当此缓冲区下溢时,读取器(您的程序)会阻塞读取。当缓冲区溢出而不是写入器(终端等)阻塞写入时,反之亦然。

当您写入标准输出时,您将写入管道,该管道绑定到终端或另一个程序。

因此,如果您的程序由终端的 shell 运行,那么您的程序输入和输出将绑定到(伪)终端。(伪)终端是可以将用户的按键转换为字符并将一些编码字符串(ISO8859-1、UTF-8 等)转换为屏幕上的符号的程序。

  1. 在您按下 EOL 的 EOF 之前,字符会存储在终端程序中。这是终端的规范模式。按下输入后,字节将写入绑定到您的程序的管道。
  2. BUFSIZ 是您尝试从每次操作的输入中读取的字节数。n返回值是操作完成时实际读取的字节数。所以 BUFSIZ 是程序可以从管道中读取的最大字节数。
  3. char buf[BUFSIZ] 是字节数组(不是某些字符集的字符),因此它可以处理任何值(包括不可打印甚至为零)。
于 2012-07-29T08:26:20.543 回答
0

由于您在循环中调用 read 直到遇到错误时到达“文件结尾”,因此每次调用 read 后您将在 buf 中准确获得 1 个字符。之后,通过 write 系统调用打印该字符。保证 read 系统调用将读取的内容不会超过最后一个参数中指定的内容。例如,如果您通过 10,则 read 将继续并尝试将读取的数据复制到数组边界之外。

至于您输入的字符 - 这些似乎是扩展的 ASCII 字符(代码 128-255),所以这里没问题。

于 2012-07-29T07:48:46.730 回答