#navi(../)
* バイナリファイルの書き込みと読み込み・fopen,fwrite,fread [#naa15fad]
C言語によるバイナリファイルの読み込みおよび書き込みのサンプルコードを以下に記します。~
サンプルコードの内容は、構造体の内容をファイルに出力するサンプルコードとファイルを読み込み構造体にセットするサンプルコードから構成されています。
#contents
#htmlinsertpcsp(c-top.html,c-sp.html)
* 関連記事 [#i7e40fc7]
-[[テキストファイルを行単位で読み込む・fgets>ファイル/テキストファイルを行単位で読み込む・fgets]]
-[[ディレクトリかどうか判別する・stat>ファイル/ディレクトリかどうか判別する・stat]]
-[[指定したディレクトリのファイル一覧を取得する・opendir,readdir>ファイル/指定したディレクトリのファイル一覧を取得する・opendir,readdir]]
-[[ファイルのサイズを取得する>ファイル/ファイルのサイズを取得する・stat]]
-[[ファイルのユーザIDとグループIDを取得する>ファイル/ファイルのUIDとGIDを取得する・stat]]
-[[fopenのファイルモード一覧表>ファイル/fopenのファイルモード一覧表]]
-[[バイナリファイルの書き込みと読み込み・fopen,fwrite,fread>ファイル/バイナリファイルの書き込みと読み込み・fopen,fwrite,fread]]
* 共通ヘッダーファイル [#i7315575]
書き込み、読み込みのサンプルコードで使用するヘッダーファイルは以下の通りです。
&ref(pkt.h); (改行コードLF)
#ifndef __PKT_H__
#define __PKT_H__
struct PKT {
int a;
int b;
int c;
};
#endif
* バイナリファイルの書き込みサンプルコード [#tbffb0a1]
バイナリファイルの書き込みサンプルコードは以下の通りです。
&ref(bin-write.c); (改行コードLF)
サンプルコードは、構造体に値をセットしファイルに出力しています。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "pkt.h"
int main(void)
{
int i;
struct PKT pkt[3];
FILE *fp = NULL;
pkt[0].a = 1; pkt[0].b = 2; pkt[0].c = 3;
pkt[1].a = 10; pkt[1].b = 20; pkt[1].c = 30;
pkt[2].a = 100; pkt[2].b = 200; pkt[2].c = 300;
for(i=0; i<3; i++) {
printf("pkt[%d].a = %d\n", i, pkt[i].a);
printf("pkt[%d].b = %d\n", i, pkt[i].b);
printf("pkt[%d].c = %d\n", i, pkt[i].c);
}
fp = fopen("data.dat", "wb");
if (fp == NULL) {
perror("fopen() error!");
exit(EXIT_FAILURE);
}
/* output to data.dat file */
if (fwrite(&pkt, sizeof(pkt), 1, fp) != 1) {
perror("fwrite() error!");
fclose(fp);
exit(EXIT_FAILURE);
}
/* file close */
if (fp != NULL) {
fclose(fp);
fp = NULL;
}
return 0;
}
* バイナリファイルの読み込みサンプルコード [#ofd10f1e]
バイナリファイルの読み込みサンプルコードは以下の通りです。
&ref(bin-read.c); (改行コードLF)
サンプルコードは上記のbin-write.cで出力されたバイナリファイルを読み込み、構造体にセットしています。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "pkt.h"
int main(void)
{
int i;
struct PKT pkt[3];
FILE *fp = NULL;
fp = fopen("data.dat", "rb");
if (fp == NULL) {
perror("fopen() error!");
exit(EXIT_FAILURE);
}
if (fread(&pkt, sizeof(pkt), 1, fp) != 1) {
perror("fwrite() error!");
fclose(fp);
exit(EXIT_FAILURE);
}
if (fp != NULL) {
fclose(fp);
fp = NULL;
}
for(i=0; i<3; i++) {
printf("pkt[%d].a = %d\n", i, pkt[i].a);
printf("pkt[%d].b = %d\n", i, pkt[i].b);
printf("pkt[%d].c = %d\n", i, pkt[i].c);
}
return 0;
}
* ファイルの書き込み読み込みの実行結果 [#hd91affd]
以下のように2つのCサンプルコードをコンパイルし実行した結果を記します。
$ gcc bin-write.c -o bin-write
$ ./bin-write
pkt[0].a = 1
pkt[0].b = 2
pkt[0].c = 3
pkt[1].a = 10
pkt[1].b = 20
pkt[1].c = 30
pkt[2].a = 100
pkt[2].b = 200
pkt[2].c = 300
上記によりdata.datが作成されています。~
またhexdumpコマンドで内容を確認してみます。
$ ls -l data.dat
-rw-r--r-- 1 sakura sakura 36 8月 10 22:36 data.dat
$ hexdump -C data.dat
00000000 01 00 00 00 02 00 00 00 03 00 00 00 0a 00 00 00 |................|
00000010 14 00 00 00 1e 00 00 00 64 00 00 00 c8 00 00 00 |........d.......|
00000020 2c 01 00 00 |,...|
00000024
次に読み込みのCサンプルコードをコンパイルし実行します。~
構造体に内容がセットされているのが確認できます。
$ gcc bin-read.c -o bin-read
$ ./bin-read
pkt[0].a = 1
pkt[0].b = 2
pkt[0].c = 3
pkt[1].a = 10
pkt[1].b = 20
pkt[1].c = 30
pkt[2].a = 100
pkt[2].b = 200
pkt[2].c = 300
以上、C言語によるバイナリファイルの書き込みと読み込みのCサンプルコードでした。
#htmlinsertpcsp(c-btm.html,c-sp.html)