広告
↓発売日:2018年09月22日↓
新品価格 |
今回からファイルに関する事などをやっていこうと思いますがその前に先頭に書いているアレの事についてもう少し詳しく説明したいと思います。
先頭についているアレというのは
#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を使っている場合で特別な設定をしていなければデスクトップ下の検索ボックスから
「ソース.cpp」という名前でソースファイルが作られているので検索
「ファイルの場所を開く」をクリックすればファイルのフォルダが表示されます。
または
PC→OS(C:)→ユーザー→お使いのコンピューター名→source→repos→Project1→Project1
みたいな順番でたどっていってもソースファイルがあるフォルダにたどりつきます。
「test.txt」ファイルの内容は
こんな感じにしてみました。
それではファイルの読み込み作業に入っていきましょう!
/*初日 プログラム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; }
ヘッダファイルに「stdlib.h」を加えてください。
こちらは後ほど紹介する「exit()」という関数を使う時に必要になります。
それではファイル操作の説明に入ります。
ファイルを操作する時にはまずファイル用の変数を用意してそこにファイルの先頭を結びつけます。
これをファイルオープンといいます。
FILE* fp; fp = fopen("test.txt", "r");
こちらですね。
ファイル用の変数は「FILE」という型を使ってポインタで宣言します。
なので「FILE」に「*」アスタリスクがつきます。
続いてファイルの先頭をこの変数に結びつけます。
fp = fopen("ファイルへのパス/ファイル名","モード");
ファイル名とモードを指定して結びつけます。
ファイルはソースファイルと同じフォルダでなければならないという事はないので必要に応じてパスで指定します。
今回はソースファイルと同じフォルダ内なのでファイル名だけで指定しております。
パスに対して心配でしたら、絶対パス、相対パスなどでインターネット検索してみてください。
「モード」っていうのはどのようにファイルを読むか選択するもので他には
読み込み用、ファイルがない場合はエラー。
書き込み用、ファイルがない場合は新しく作成、すでにある場合は内容を書き換え。
追加用、ファイルがない場合は新しく作成
などがあります。
それぞれ書き込み・読み込みの両方使えるモードにしたい場合は
「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; }
内容を中途半端に表示してみました。
もちろん一気に全ての内容を表示する方法も後ほど紹介いたしますのでご安心ください。
ファイルの内容を読むには何種類か方法がありますが今回はその中の「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; }
先ほどのプログラムに「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」の内容を少し変更してみました。
先ほどのプログラムを再度実行すると・・・。
きちんと表示されましたね!
それでは次回はこの読み込んだ値を利用してみたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |