fread関数 - バイト数を指定してファイルから読み込み
fread関数を使うと、バイト数を指定してファイルから読み込むことができます。stdio.hヘッダを読み込むと使えます。
#include <stdio.h> size_t fread(void *buffer, size_t size, size_t n, FILE *fp);
第一引数は、ファイルから読み込まれた内容が格納されるバッファです。読み込んだ内容を格納できるメモリサイズを確保しましょう。第二引数は、読み込むデータのバイトの単位です。第三引数は、読み込むデータの個数です。実際に読み込まれるバイトサイズは「size * n」になります。第四引数は、読み込みたいファイルのファイルストリームです。
戻り値は、読み込んだデータの個数です。第三引数で指定したデータの個数に対応しています。バイトサイズではないので注意してください。読み込みが、ファイルの末尾に到達したときは、戻り値が、第三引数で指定したデータの個数より小さくなります。
fread関数で読み込むサンプル
fread関数で読み込むサンプルです。fopen関数でファイルを開き、16バイトずつ読み込み、putchar関数で標準出力に出力し、fclose関数でファイルを閉じています。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
// ファイルを読み込みモードで開く
const char* in_file = "input.txt";
FILE* in_fp = fopen(in_file, "r");
if (in_fp == NULL) {
fprintf(stderr, "Can't open file %s\n", in_file);
exit(1);
}
// 読み込んで、標準出力に出力
while(1) {
char buffer[16];
int32_t read_unit = 1;
int32_t read_count = 16;
size_t real_read_count = fread(buffer, read_unit, read_count, in_fp);
// 読み込んだ文字を出力
for (int32_t i = 0; i < real_read_count; i++) {
putchar(buffer[i]);
}
// わかりやすいように改行
printf("\n");
if (real_read_count < read_count) {
break;
}
}
// fclose関数でファイルを閉じる
fclose(in_fp);
}
入力ファイル「input.txt」です。
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccddddddddddddddddddddd
出力結果です。
aaaaaaaaaaaaaaaa aaaaaabbbbbbbbbb bbbbbbbbbbbbbbcc cccccccccccccccc ccccccccdddddddd ddddddddddddd
ファイル全体を読み込む
fread関数でファイル全体を読み込むサンプルです。ftell関数とfseek関数を使って、ファイルのサイズを取得して、calloc関数でメモリを確保し、ファイル全体を読み込んでいます。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(void) {
// ファイルを開く
const char* in_file = "input.txt";
FILE* in_fp = fopen(in_file, "r");
if (in_fp == NULL) {
fprintf(stderr, "Can't open file %s at %s line %d\n", in_file, __FILE__, __LINE__);
exit(1);
}
// ファイルの末尾に位置指定子を移動
fseek(in_fp, 0, SEEK_END);
// ファイルの末尾の位置を取得。これは、ファイサイズになります。
size_t file_size = (int32_t)ftell(in_fp);
// メモリ確保
char* buffer = calloc(file_size + 1, sizeof(char));
// ファイルの先頭に位置指定子を移動
fseek(in_fp, 0, SEEK_SET);
// ファイルを読み込み
size_t read_count = fread(buffer, sizeof(char), file_size, in_fp);
if (read_count != file_size) {
fprintf(stderr, "Can't read file %s at %s line %d\n", in_file, __FILE__, __LINE__);
exit(1);
}
// ファイルの内容を確認
printf("%s\n", buffer);
// ファイルを閉じる
fclose(in_fp);
}
入力ファイルです。
Hello World!
出力結果です。
Hello World!
C言語ゼミ


