【C++入門】fread()関数の使い方と動作をわかりやすく解説
本記事では、C++における fread() 関数の動作について詳しく解説します。あわせて、fread() に渡される各パラメータの意味や、この関数が返す戻り値についても確認していきます。
fread() は、C++標準ライブラリ(<cstdio>)に用意されている組み込み関数で、ストリームからデータブロックを読み込むために使用されます。この関数は、ストリームから「size」バイトのサイズを持つオブジェクトを「count」個分読み取り、バッファメモリへ格納します。読み込みが完了すると、ファイル位置ポインタは読み取った合計バイト数ぶん進められます。処理が成功した場合、読み取られる総バイト数は「size × count」となります。
構文
fread(void *buffer, size_t size, size_t count, FILE *file_stream);
パラメータ
fread() 関数には、以下の4つのパラメータをすべて指定する必要があります。それぞれの役割を見ていきましょう。
buffer … ストリームから読み取ったデータを格納するための、バッファメモリブロックへのポインタです。
size … 読み込む1要素あたりのサイズをバイト単位で指定します(
size_tは符号なし整数型です)。count … 読み込む要素の個数を指定します。
file_stream … データを読み込む対象となるファイルストリームへのポインタです。
戻り値
正常に読み込みが完了した要素の個数が戻り値として返されます。
読み込み中にエラーが発生した場合、またはファイルの終端(EOF)に到達した場合には、返される要素数は引数 count の値と異なることがあります。そのため、戻り値をチェックすることで、意図した通りの読み込みが行われたかどうかを判定できます。
使用例
まずは基本的な使い方として、テキストファイルの内容を fread() で読み出す例を見てみましょう。
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
int main() {
FILE* file_stream;
char buf[100];
file_stream = fopen("tp.txt", "r");
while (!feof(file_stream)) // ファイルの終端まで繰り返し読み込む
{
// ファイルの内容を読み取る
fread(buf, sizeof(buf), 1, file_stream);
cout << buf;
}
return 0;
}
ここで、tp.txt ファイルに以下の内容が書かれているものとします。
tutorialspoint
Contribution
anything here
実行結果
上記のコードを実行すると、次のような出力が得られます。
tutorialspoint Contribution anything here
size や count が 0 の場合の挙動
次に、引数の count が 0 の場合、および size が 0 の場合に、どのような戻り値になるのかを実際に確かめてみます。
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
FILE *fp;
char buffer[100];
int retVal;
fp = fopen("tpempty.txt","rb");
retVal = fread(buffer,sizeof(buffer),0,fp);
cout << "The count = 0, then return value = " << retVal << endl;
retVal = fread(buffer,0,1,fp);
cout << "The size = 0, then value = " << retVal << endl;
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
The count = 0, then return value = 0 The size = 0, then value = 0
この結果から、size または count に 0 を指定した場合、読み込むべきデータ量が 0 バイトとなるため、戻り値も必ず 0 になることがわかります。これはエラーではなく正常な挙動なので、プログラム側で戻り値を扱う際には注意しておくとよいでしょう。
-
C++で双方向リンクリストのサイズ(要素数)を求めるプログラム
本記事では、双方向リンクリスト(Doubly Linked List)が与えられたときに、そのサイズ(要素数)を求めるC++プログラムの作成方法を詳しく解説します。 双方向リンクリストとは、片方向リンクリストと比べて、各ノードが前後両方向のリンクを持つため、前方にも後方にも自由に移動できる特殊なリンクリストです。まず、双方向リンクリストを理解するうえで重要な用語を確認しておきましょう。 リンク(Link):リンクリストの各リンクには、「要素」と呼ばれるデータが格納されます。 ネクスト(Next):各リンクには、次のリンクを指す参照「Next」が含まれます。 プレヴ(Prev):各リンクに
-
C++の再帰を使って木(ツリー)のサイズを計算するプログラムの作成方法
この問題では、二分木が与えられ、「再帰」を使って木のサイズを計算するプログラムを作成することが課題となります。 ここでいう木のサイズとは、その木に含まれるノードの総数のことです。 具体例を見ながら問題を理解していきましょう。 上の木の場合、サイズは 5 となります。 解法の考え方:再帰によるサイズ計算 木のサイズを求めるには、左部分木のサイズ + 右部分木のサイズ + 1(現在のノード) を計算します。再帰関数は、木の左右それぞれの部分木に対して呼び出され、部分木が存在しない(NULL の)場合は 0 を返します。 上記の例をこの手法で解いてみる ルート(値3)のサイズを求める場合: si