考虑以下用于将文件内容读入缓冲区的代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BLOCK_SIZE 4096
int main()
{
int fd=-1;
ssize_t bytes_read=-1;
int i=0;
char buff[50];
//Arbitary size for the buffer?? How to optimise.
//Dynamic allocation is a choice but what is the
//right way to relate the file size to bufffer size.
fd=open("./file-to-buff.txt",O_RDONLY);
if(-1 == fd)
{
perror("Open Failed");
return 1;
}
while((bytes_read=read(fd,buff,BLOCK_SIZE))>0)
{
printf("bytes_read=%d\n",bytes_read);
}
//Test to characters read from the file to buffer.The file contains "Hello"
while(buff[i]!='\0')
{
printf("buff[%d]=%d\n",i,buff[i]);
i++;
//buff[5]=\n-How?
}
//buff[6]=`\0`-How?
close(fd);
return 0;
}
代码说明:
- 输入文件包含一个字符串“Hello”
- 需要将此内容复制到缓冲区中。
- 目标是通过POSIX API 实现的
open
。read
- 读取 API 使用指向 *任意大小* 的缓冲区的指针来复制数据。
问题:
- 动态分配是必须用来优化缓冲区大小的方法。从输入文件大小关联/导出缓冲区大小的正确程序是什么?
- 我看到在操作结束时,除了字符"Hello"
read
之外,读取还复制了 anew line character
和一个字符。请详细说明这种读取行为。NULL
样本输出
bytes_read=6
buff[0]=H
buff[1]=e
buff[2]=l
buff[3]=l
buff[4]=o
buff[5]=
PS:输入文件是用户创建的文件,不是由程序创建的(使用write
API)。只是在这里提一下,以防万一。