広告
↓発売日:2018年09月22日↓
新品価格 |
前回までやっていたファイル操作はファイルの先頭から読み書きするのが基本でした。
今回はファイルの好きな場所から読み書きするいわゆるランダムアクセスについてやっていきたいと思います。
では下準備として「test.txt」のデータを変更します。
次のプログラムを実行して「test.txt」の内容を書き換えてください。
/*七日目 プログラム1*/ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(){ int ary[15] = {1,21,500,400,1572,2,18,420, 400,1200,3,25,800,750,3000}; FILE* fp; fp = fopen("test.txt", "w"); if (fp == NULL){ printf("ファイルオープン失敗\n"); exit(1); } fwrite(ary,sizeof(int),15,fp); fclose(fp); return 0; }
結果を見ても相変わらず意味不明な文字が並ぶだけですが
「1,21,500,400,1572,2,18,420,400,1200,3,25,800,750,3000」
こちらの内容になってるはずですね。
ではランダムアクセスをしてみたいと思います。
ランダムアクセスをするにはファイルを読み書きする初期位置を変更する「fseek()」という関数を使います。
fseek(ファイルポインタ,何バイト目か,SEEK_SET);
ファイルポインタにはランダムアクセスしたいファイル、いつもの「fp」などが入ります。
そして最後の「SEEK_SET」これはファイルの最初からという意味です。
そして何バイト目から読み書きするのかを指定します。
たとえば
「1,21,500,400,1572,2,18,420,400,1200,3,25,800,750,3000」
このデータの中間あたりの
「2,18,420,400,1200」
ここだけ抜き出したいと思った時はまずは読み書きする先頭を「2」の位置に合わせるので最初から数えて
int(4バイト)×5番目=20
ここが初期位置になるので
fseek(fp,20,SEEK_SET);
このようになります。
この「20」バイトを直接指定するトコロは環境によって変わるので
sizeof(int) * 5
と「sizeof()」を使ってサイズを調べた方がいいかもしれません。
あとは「fread()」や「fwrite()」を使って5つ分データを読み書きするだけです!
広告
ではさっそく「fseek()」と「fread()」を使って途中のデータを読み出してみます。
/*七日目 プログラム2*/ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(){ int load_ary[5] = {0}; FILE* fp; int count; fp = fopen("test.txt", "r"); if (fp == NULL){ printf("ファイルオープン失敗\n"); exit(1); } printf("最初の位置 = %d\n",ftell(fp)); fseek(fp,sizeof(int) * 5,SEEK_SET); printf("fseek後の位置 = %d\n",ftell(fp)); fread(load_ary,sizeof(int),5,fp); printf("fread後の位置 = %d\n\n",ftell(fp)); for(count = 0;count < 5;count++){ printf("load_ary[%d] = %d\n",count,load_ary[count]); } fclose(fp); return 0; }
「ftell()」関数を使うと現在のファイル位置を知る事ができます。
実行結果を見ると、どうやらうまくいったみたいです。
ちなみにこのように「fseek()」関数などでファイルポインタの位置をずらした後に
fseek(fp,sizeof(int) * 5,SEEK_CUR);
この最後の引数「SEEK_SET」を「SEEK_CUR」にすると、そのずれた位置から指定されたバイトの位置に移動する事になります。
それでは最後に好きな場所に書き込みをしてみます。
手順としては「fseek()」でずらした後に書き込みの「fwrite()」を実行する感じですね!
/*七日目 プログラム3*/ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(){ int save_ary[5] = {65,66,67,68,69}; FILE* fp; int count; fp = fopen("test.txt", "r+"); if (fp == NULL){ printf("ファイルオープン失敗\n"); exit(1); } printf("最初の位置 = %d\n",ftell(fp)); fseek(fp,sizeof(int) * 5,SEEK_SET); printf("fseek後の位置 = %d\n",ftell(fp)); fwrite(save_ary,sizeof(int),5,fp); printf("fwrite後の位置 = %d\n\n",ftell(fp)); fclose(fp); return 0; }
中間あたりに「ABCDE」と現れました!
途中部分だけ書き込みの時には「r+」と読み書きモードをセットするのに注意です。
これらを使えばひとつのファイルに異なる種類のデータを入れて自由に読み書きする事ができますね!
それでは通常のファイル読み書きからランダムアクセスまで見てきましたが、ここまででファイル処理に関する事は終わりにしたいと思います。
次回は複数の条件を指定するやり方を見ていきたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |