C言語 入門 小学生でもわかるC言語3

七日目 好きな場所から読み書き

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語3 目次/七日目 好きな場所から読み書き/

広告

↓2016年02月29日発売↓

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

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

好きな場所から読み書き

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

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

下準備

では下準備として「test.txt」のデータを少し増やします。

次のプログラムを実行して「test.txt」の内容を書き換えてください。

/*プログラム15*/
#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;
}

■実行結果■

実行結果(i-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つ分データを読み書きすれば大丈夫ですね!

まずは「fread()」でデータを読み出してみます。

/*プログラム16*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	int load_ary[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,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;
}

■実行結果■

実行結果(i-7-2)

「ftell()」関数を使うと現在のファイル位置を知る事ができます。

どうやらうまくいったみたいです。

ファイルの読み書きする初期位置を指定して読み書きする、そんなに難しくはないですね!

もちろん書き込みも同じ作業で大丈夫です。

/*プログラム17*/
#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;
}

■実行結果■

実行結果(i-7-3)

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

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

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

次回は一度ファイル操作から離れて複数の条件を指定するやり方を見ていきたいと思います。

次回

八日目 複数の条件

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本