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

时间:2015-02-02 04:38:38

标签: c file-io

我正试图绕过read()系统调用。

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

第一个参数是文件描述符,类型为int 如何将文件传递给read()电话?

3 个答案:

答案 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.