画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語3 目次/七日目 ランダムアクセス

広告

[C言語 入門 小学生でもわかるC言語3]
七日目 ランダムアクセス

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

好きな場所から読み書き

前回までやっていたファイル操作はファイルの先頭から読み書きするのが基本でした。

今回はファイルの好きな場所から読み書きするいわゆるランダムアクセスについてやっていきたいと思います。

下準備

では下準備として「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;
}

「test.txt」

画像(ci_7_1)

結果を見ても相変わらず意味不明な文字が並ぶだけですが

「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;
}

■実行結果■

画像(ci_7_2)

「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;
}

■実行結果■

画像(ci_7_3)

中間あたりに「ABCDE」と現れました!

途中部分だけ書き込みの時には「r+」と読み書きモードをセットするのに注意です。

これらを使えばひとつのファイルに異なる種類のデータを入れて自由に読み書きする事ができますね!

それでは通常のファイル読み書きからランダムアクセスまで見てきましたが、ここまででファイル処理に関する事は終わりにしたいと思います。

次回は複数の条件を指定するやり方を見ていきたいと思います。

次回

八日目 複数の条件

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓発売日:2016年02月29日↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)