使用 read() 逐字节读取文件

Read file byte by byte using read()

我正在努力思考 read() 系统调用。

如何使用 read() 逐字节 读取实际文件

第一个参数是int类型的文件描述符。
如何将文件传递给 read() 调用?

您使用 open(); you pass the file descriptor returned by open() to read() 打开文件。

int fd;
if ((fd = open(filename, O_RDWR)) >= 0)
{
    char c;
    while (read(fd, &c, 1) == 1)
        putchar(c);
}

还有return文件描述符的其他函数:creat(), pipe(), socket(), accept()

请注意,虽然这可行,但效率低下,因为它会进行大量系统调用。通常,您一次读取大量字节以减少系统调用的次数。标准 I/O 库(在 <stdio.h> 中)会自动处理这个问题。如果您使用低级 open()read()write()close() 系统调用,您必须自己担心缓冲等问题。

read() 的最后一个参数是要从文件中读取的字节数,因此将 1 传递给它就可以了。在此之前,您使用 open() 获取文件句柄,如下所示(未经测试的代码):

int fh = open("filename", O_RDONLY);
char buffer[1];
read(fh, buffer, 1);

但是,通常不建议逐字节读取文件,因为它会显着影响性能。相反,您应该缓冲输入并分块处理,如下所示:

int fh = open("filename", O_RDONLY);
char buffer[BUFFER_SIZE];
read(fh, buffer, BUFFER_SIZE);

for (int i=0 ; i < BUFFER_SIZE ; ++i) {
   // process bytes at buffer[i]
}

你最终会在一个循环中包装你的读取,直到达到 EOF。

kernel的read()系统调用的概念是这样的(简单的英文)

读取(从这个文件(文件描述符),到内存中的这个缓冲区,这个大小)

示例:从磁盘中的文件逐个字符读取到此缓冲区 BUFF

int fd // initialize the File Descriptor 
fd = open ("file_name", O_RDONLY); //open a file with file name in read only mode.
char BUFF;

read (fd,&BUFF,sizeof(char)); // read file with file descriptor into the address of the BUFF buffer in the memory of a character of size CHAR data type.