画像(logo)

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

広告

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

広告

↓2016年02月29日発売↓

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

目次へ戻る

好きな場所から読み書き

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

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

下準備

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

広告

↓2017年06月16日発売↓

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

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

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

新品価格
¥2,700から
(2017/5/1 13:15時点)