ファイルの内容をバッファに読み込むための次のコードについて考えてみます。
#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」が含まれています
- このコンテンツをバッファにコピーする必要があります。
- 目的は、POSIXAPIによって達成され
open
ますread
。 - 読み取りAPIは、任意のサイズのバッファーへのポインターを使用して、データをコピーします。
質問:
- 動的割り当ては、バッファのサイズを最適化するために使用する必要がある方法です。入力ファイルサイズからバッファサイズを関連付ける/導出するための正しい手順は何ですか?
- 操作の最後に、読み取りで「Hello」という文字に加えてaと1つの文字
read
がコピーされていることがわかります。この読み取りの動作について詳しく説明してください。new line character
NULL
サンプル出力
bytes_read = 6
バフ[0]=H
buff [1] = e
バフ[2]=l
バフ[3]=l
buff [4] = o
バフ[5]=
PS:入力ファイルは、プログラムによって作成されたものではなく、ユーザーが作成したファイルです(write
APIを使用)。それが何か違いを生む場合に備えて、ここで言及するだけです。