使用 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.
我正在努力思考 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.