/*
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;
}
当我输入“∂ΣΣ®†¥¥¥˚πΔ~~∫∫√çtu886661~EOF”作为输入时,将复制相同的内容。 如何同时存储这么多非ASCII字符?
BUFSIZ是要传输的字节数。 如果对于任何值,BUFSIZ如何限制字节传输,任何东西都可以从输入复制到输出?
char buf [BUFSIZ]如何存储非ASCII字符?
答案 0 :(得分:4)
你读到小块直到EOF:
while ((n = read(0, buf, BUFSIZ)) > 0)
这就是原因。从字面上看,逐字节,复制输入到输出。如何将它转换回unicode,是控制台的问题,而不是你的问题。我猜,它不会输出任何东西,直到它可以将数据识别为符号。
答案 1 :(得分:0)
由于您在循环中调用read直到遇到错误时达到“文件结尾”,因此在每次调用read之后,您将在buf中获得正好1个字符。之后,通过写入系统调用打印该字符。保证读取系统调用的读取次数不会超过最后一个参数中指定的值。例如,如果您传递10,在您的情况下,将继续读取并尝试将读取的数据复制到数组范围之外。
至于你喂的字符 - 这些似乎是扩展的ASCII字符(代码128-255),所以这里没问题。
答案 2 :(得分:0)
当你从标准输入调用read时,你正在读取管道,绑定到终端或另一个程序。当然,在编写器(终端或其他程序)和程序之间有一个缓冲区。当此缓冲区是下溢读取器(您的程序)在读取时阻塞。当缓冲区溢出时写入阻塞写入器(终端等)。
反之亦然,当你写入标准输出时,你写入管道,绑定到终端或另一个程序。
因此,如果您的程序是由终端从shell运行的,那么您的程序输入和输出将绑定到(伪)终端。 (伪)终端是可以将用户按键转换为字符并将一些编码字符串(ISO8859-1,UTF-8等)转换为屏幕上的符号的程序。
n
返回值是操作完成时实际读取的字节数。因此,BUFSIZ是程序可以从管道中读取的最大字节数。