画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語3 目次/初日 ファイル読み込み

広告

[C言語 入門 小学生でもわかるC言語3]
初日 ファイル読み込み

広告

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

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

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

目次へ戻る

ヘッダファイルの事

今回からファイルに関する事などをやっていこうと思いますがその前に先頭に書いているアレの事についてもう少し詳しく説明したいと思います。

先頭についているアレ

先頭についているアレというのは

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

いつも最初に書いているこれらの事です。

まず「#include <~.h>」についてですが、これは正式にはヘッダファイルといいまして、このファイルの中にはそれぞれいろいろな関数が入ってます。

それを「#include→挿入(そうにゅう)」する事によってその関数が使えるようになるというワケです。

例えば時間関係の関数が入っている「time.h」や文字列処理関係の関数が入っている「string.h」などがあります。

ではいつも使っていた「stdio.h」には何が入っているかというとなんと「printf()」関数などが入っております。

これがなければC言語は「printf()」関数も使えないワケです。

逆にいうとこのヘッダファイルに超強力なヘッダファイルを加える事によって画像やら音楽やらまでも使えるようになったりします。

興味がある方は「DXライブラリ」などのキーワードでインターネット検索してみてください。

続いて

「#define _CRT_SECURE_NO_WARNINGS」

これはヘッダファイルとは違うものなのですが、コンパイラから出されるセキュリティ上の警告を無視する為にこれを書きます。

C言語の古くからある関数の中には使い方を間違えるとセキュリティ上大変危険な関数がいくつかあります。

大規模なシステム開発などでそのようなセキュリティ上の問題が発生してしまうと非常にマズイのでいちいち「大丈夫ですか?」と警告してくるワケです。

そこでセキュリティの対策された関数を使えば良いのですが、初心者には少し難しいので昔からあるわかりやすいシンプルな関数を使う為にこの

「#define _CRT_SECURE_NO_WARNINGS」

を入れて警告を無視するというワケです。

では話が少しそれましたが、本題のファイル処理についてみていきましょう!

ファイルの準備

まずはテスト用にメモ帳で「test.txt」という名前のファイルを作ってソースファイルがおいてあるフォルダと同じトコロに保存してください。

ソースファイルが置いてある場所ですが、VisualStudio2019を使っている場合で特別な設定をしていなければデスクトップ下の検索ボックスから

画像(ci_1_1)

「ソース.cpp」という名前でソースファイルが作られているので検索

画像(ci_1_2)

「ファイルの場所を開く」をクリックすればファイルのフォルダが表示されます。

画像(ci_1_3)

または

PC→OS(C:)→ユーザー→お使いのコンピューター名→source→repos→Project1→Project1

みたいな順番でたどっていってもソースファイルがあるフォルダにたどりつきます。

「test.txt」ファイルの内容は

画像(ci_1_4)

こんな感じにしてみました。

それではファイルの読み込み作業に入っていきましょう!

ファイルのオープンとクローズ

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

int main(){
	FILE* fp;

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

	fclose(fp);
	return 0;
}

■実行結果■

画像(ci_1_5)

ヘッダファイルに「stdlib.h」を加えてください。

こちらは後ほど紹介する「exit()」という関数を使う時に必要になります。

それではファイル操作の説明に入ります。

ファイルを操作する時にはまずファイル用の変数を用意してそこにファイルの先頭を結びつけます。

これをファイルオープンといいます。

FILE* fp;
fp = fopen("test.txt", "r");

こちらですね。

ファイル用の変数は「FILE」という型を使ってポインタで宣言します。

なので「FILE」に「*」アスタリスクがつきます。

続いてファイルの先頭をこの変数に結びつけます。

fp = fopen("ファイルへのパス/ファイル名","モード");

ファイル名とモードを指定して結びつけます。

ファイルはソースファイルと同じフォルダでなければならないという事はないので必要に応じてパスで指定します。

今回はソースファイルと同じフォルダ内なのでファイル名だけで指定しております。

パスに対して心配でしたら、絶対パス、相対パスなどでインターネット検索してみてください。

「モード」っていうのはどのようにファイルを読むか選択するもので他には

「r」

読み込み用、ファイルがない場合はエラー。

「w」

書き込み用、ファイルがない場合は新しく作成、すでにある場合は内容を書き換え。

「a」

追加用、ファイルがない場合は新しく作成

などがあります。

それぞれ書き込み・読み込みの両方使えるモードにしたい場合は

「r+」「w+」「a+」とプラスをつけます。

続きを見てみます。

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

こちらはエラー処理になります。

「NULL」っていうのは空っぽみたいな意味になり、エラー処理の時などによく登場します。

ファイルのオープンに成功するとファイル変数にはそのファイルの先頭アドレスが入ります。

なので「fp == NULL」の場合はその入るはずのアドレスが入っておらず空っぽみたいな意味になるのでエラーになるのです。

そしてファイルのオープンに失敗した場合はマズイ事にならないようにここで「exit(1)」というのを使って強制的に終了します。

ファイルのオープンが無事に終わり最後正常に終了する時は

fclose(fp);

こちらを使ってファイルをクローズします。

広告

ファイル操作の基本動作

ここまでがファイル操作の上での必ず行う基本動作になります。

ファイルをオープン→正常にオープンされたか確認→開いたファイルをクローズ

みたいな流れになります。

このオープン、クローズの間にそのファイルに必要な作業などを行っていきます。

ファイルなどの処理は間違った使い方をしてしまうとそのファイルの内容のみならず隣接したデータ領域なども破壊しかねないのでこのような儀式的な手順があるのですね!

それではファイルオープン・クローズの仕方がわかったトコロで次はその内容を表示してみたいと思います。

内容を表示

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

int main(){
	int get_c;
	FILE* fp;

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

	get_c = fgetc(fp);
	printf("%c",get_c);

	get_c = fgetc(fp);
	printf("%c",get_c);

	get_c = fgetc(fp);
	printf("%c",get_c);

	printf("\n");

	fclose(fp);
	return 0;
}

■実行結果■

画像(ci_1_6)

内容を中途半端に表示してみました。

もちろん一気に全ての内容を表示する方法も後ほど紹介いたしますのでご安心ください。

ファイルの内容を読むには何種類か方法がありますが今回はその中の「fgetc()」という関数を使ってみます。

読み込み先の変数 = fgetc(ファイルポインタ);

これはファイル(f)から一文字(c)ずつ読み込む(get)関数になります。

読み込まれた内容は「int」型として返されるので「int」型の変数を用意してそこにこの「fgetc()」で読み込んだ内容を入れます。

get_c = fgetc(fp);

あとは読み込まれた内容はその変数に入っているので表示するなり加工するなりする事ができます。

ここで上のプログラムに注目です。

3回ほど「fgetc()」を実行しているのがわかると思います。

実行結果もきちんと3文字分表示されております。

つまりは一文字読んで次に進んで一文字読んで次に・・・。

みたいな動作をします。

細かい部分は置いといてここで大事なのがこの「fgetc()」は実行するたびに勝手に次に進むという事です。

なのでその性質を利用して「while()」ループなどでこの「fgetc()」を実行し続ければファイルの最後まで勝手にいってくれるという事ですね。

一気に内容を表示

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

int main(){
	int get_c;
	FILE* fp;

	fp = fopen("test.txt", "r");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}
	
	while (1){
		get_c = fgetc(fp);
		if (!feof(fp)){
			printf("%c", get_c);
		}
		else{
			break;
		}
	}

	printf("\n");

	fclose(fp);
	return 0;
}

■実行結果■

画像(ci_1_7)

先ほどのプログラムに「while()」ループを加えて一気に表示してみました。

while (1){
	get_c = fgetc(fp);
	if (!feof(fp)){
		printf("%c", get_c);
	}
	else{
		break;
	}
}

ここではファイルの最後まで読み込む事が目的なのでファイルの最後かどうかを調べる「feof()」という関数を使っております。

この関数はファイルの最後に到達した時には「0」以外になり、ファイルの途中では「0」になるので、「if (!feof(fp))」の時、つまりはファイルが最後ではない時に必要な処理を実行して、そうでなければ「else」に「break」を指定しておけばファイルを最後まで読み込み終了する事ができます!

実行結果を見るとうまく全てファイルの内容が表示できたみたいですね!

もちろんひらがななども読み込む事ができます。

「test.txt」の内容を少し変更してみました。

画像(ci_1_8)

先ほどのプログラムを再度実行すると・・・。

■実行結果■

画像(ci_1_9)

きちんと表示されましたね!

それでは次回はこの読み込んだ値を利用してみたいと思います。

次回

二日目 ファイルの値を利用する

□ページの先頭へ□

□目次へ戻る□

□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時点)