我正试图绕过read()
系统调用。
如何使用read()
读取实际文件逐字节?
第一个参数是文件描述符,类型为int
如何将文件传递给read()
电话?
答案 0 :(得分:6)
您使用open()
打开文件;将open()
返回的文件描述符传递给read()
。
int fd;
if ((fd = open(filename, O_RDWR)) >= 0)
{
char c;
while (read(fd, &c, 1) == 1)
putchar(c);
}
还有其他函数可以返回文件描述符:creat()
,pipe()
,socket()
,accept()
等。
请注意,虽然这会起作用,但效率很低,因为它会进行大量的系统调用。通常,您一次读取大量字节,以减少系统调用的数量。标准I / O库(在<stdio.h>
中)自动处理。如果您使用低级open()
,read()
,write()
,close()
系统调用,则必须为自己担心缓冲等。
答案 1 :(得分:1)
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。
答案 2 :(得分:0)
对内核的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.