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

六日目 サイズを指定して読み書き

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

HOME/小学生でもわかるC言語3 目次/六日目 サイズを指定して読み書き/

広告

↓2016年02月29日発売↓

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

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

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

目次へ戻る

?と思ったら

わからなそうな用語集

サイズを指定してファイル書き込み

では前回やった「sizeof」を使って指定サイズずつファイルにデータを書き込んでみたいと思います。

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

int main(){
	int ary[5] = {12,256,333,1465,7};
	FILE *fp;

	fp = fopen("test.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	fwrite(ary,sizeof(int),5,fp);

	fclose(fp);
	return 0;
}

■実行結果■

実行結果(i-6-1)

「12,256,333,1465,7」のばらばらなデータを用意して「test.txt」に書き込みをします。

ここで結果を見てみると・・・。

なにやら意味不明な文字が出ているだけで先ほどの内容は出てきません。

なぜだろうと思いますがその前にデータサイズを指定して書き込みを行う「fwrite()」について説明します。

fwrite(元のデータ,サイズ,書き込む回数,書き込み先);

指定サイズずつ決められた回数分データを書き込みます。

さきほどのプログラムでいうと

int ary[5] = {12,256,333,1465,7};

こちらの「int」の配列データを

fwrite(ary,sizeof(int),5,fp);

5回分書き込んでいるのが確認できますね!

何も問題はありません。

ではここで書き込まれているのとしてこの「test.txt」から指定サイズずつデータを読み込んでみましょう。

サイズを指定してファイル読み込み

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

int main(){
	int ary2[5] = {0,0,0,0,0};
	FILE *fp;
	int count;

	fp = fopen("test.txt", "r");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	fread(ary2,sizeof(int),5,fp);

	for(count = 0;count < 5;count++){
		printf("ary2[%d] = %d\n",count,ary2[count]);
	}

	fclose(fp);
	return 0;
}

■実行結果■

実行結果(i-6-2)

先ほどのデータ

int ary[5] = {12,256,333,1465,7};

と合わせると無事に読み込み成功しました!

「int」のサイズとは

指定サイズでデータを読み込むには「fread()」を使います。

fread(読み込み先,サイズ,読み込む回数,元データ);

「fwrite()」とほとんど変わりませんね!

ただ逆になった感じです。

ではさきほどのギモンのなぜゆえに意味不明な文字で書き込まれてしまうのかという事ですが、ここから先は文字コードやら進数の事やらを知らないと結構ややこしい話な上に理解できたトコロで特別役に立つ事でもないので聞き流してしまっても大丈夫です。

それではまずはさきほどのプログラム13の書き込む内容を

int ary[5] = {65,66,67,68,69};

こちらに書き換えて実行してみてください。

実行結果(i-6-3)

すき間をあけながら「ABCDE」と表示されましたね!

「65」は文字コードでいうトコロの「A」にあたるのでなんとなくそれっぽく書き込まれているのが確認できると思います。

じゃあこのすき間は何だといいますとすき間をカーソルで数えながらなぞって見ると3つある事がわかります。

ここで「int」のサイズを思い出してみてください。

「int = 4」これは4バイトという事ですね。

それで先ほどのすき間と表示された文字の事を考えると

「A???B???C???D???E???」

すき間を「?」で埋めてみましたが、なんとなく4バイトずつデータが並んでいるというのがわかりますでしょうか?

つまりは「int」サイズずつという事です。

それでさきほどの「65」を2進数で表すと

「0000000000000000000000001000001」

になります。

それでデータを書き込む時はこれを1バイトずつに区切り

@「00000000」A「00000000」B「00000000」C「01000001」

順番を入れ替えてお尻から書き込みます。

C「01000001」B「00000000」A「00000000」@「00000000」

それでこのデータをメモ帳などで表示してすると1バイトずつ文字コードに置き換えて表示するので

「01000001」→「A」

「00000000」→空白になります

結果「A   」のように表示されたワケです。

確認の為に先ほどの書き込むデータを

int ary[5] = {16705,66,67,68,69};

こちらに置き換えてみると・・・。

実行結果(i-6-4)

先頭が「AA  」になりましたね。

「16705」を2進数で表すと

「00000000000000000100000101000001」

になります。

先ほどの規則に従って並べなおすと

「01000001」「01000001」「00000000」「00000000」

順番が入れ替えられて1バイトずつ表示されるので

「AA  」になるワケですね!

ようやく元の話に戻るとこのように1バイトずつに区切って順番を入れ替えられてそれを文字コードに置き換えて表示するので元のデータのまま表示されないのです。

だいぶわかりずらかったと思いますのでお許しください。

次回は好きな場所からデータを読み書きしたいと思います。

次回

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

□ページの先頭へ□

□目次へ戻る□

広告

↓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++言語本