#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)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS