*1:処理を終了したり、パソコンの電源をきったりすることでデータの内容が失われることを揮発といい、そのデータを格納しているメモリのことを揮発性メモリと言います。主記憶などがそれにあたります。
*2:処理を終了したり、パソコンの電源をきったりしてもデータの内容が保持されることを不揮発といい、そのデータを格納しているメモリのことを不揮発性メモリと言います。ハードディスクやフロッピーディスク等がそれにあたります。よって、ファイルは、ハードディスクやフロッピーディスク等に作成・保存されます。
テキストファイルには、
|
|
|
C言語ソースファイル | .c | C言語のプログラムを記述したファイル |
C言語ヘッダーファイル | .h | C言語のヘッダーを記述したファイル |
C++ソースファイル | .cpp | C++のプログラムを記述したファイル |
HTML文章 | .html | インターネットで使われているマークアップ文章 |
データファイル | .dat | 様々なデータを保存するファイル |
また、バイナリファイルには、
|
|
|
JPEG画像ファイル | .jpg | JPEG圧縮された画像ファイル |
GIF画像ファイル | .gif | GIF圧縮された画像ファイル |
WAV音声ファイル | .wav | WINDOWS標準音声ファイル |
MPEGファイル | .mpg | MPEG圧縮された動画ファイル |
今回は、主にテキストファイルのデータファイルに関して、作成・書きこみ・読みこみなどの方法を説明していきます。
注)拡張子:"*.xxx"の".xxx"の部分で、ファイルの種類を決定する役割をします。
1:FILE宣言子を使って、ファイルポインターを宣言する。
2:ファイルを開く。
3:ファイルにデータを書いたり、ファイルからデータを読んだりする。
4:ファイルを閉じる。
という作業です。
みなさんが勉強するときに、ノートを用意し、そのノートを開け、読み書きをした後、ノートを閉じて勉強を終了する作業と同じようなものです。
ファイルに書きこむ
では、ファイルの4つの基本手順を含めて、ファイルに数値や文字を書きこんでみます。以下のプログラムをみてください
|
|
#include <stdio.h> void main(void) { char myName[] = {"YamadaKouji"}; int myNumber = 96131028; FILE *fp; //ファイルポインター fp = fopen("test.dat","w"); //ファイルを開く //ファイルに書きこむ fprintf(fp,"%s %d\n",myName,myNumber); //区切り文字:スペース fprintf(fp,"%d,%s\n"myNumber,myName,); //区切り文字:カンマ //画面に出力 printf("%s %d\n",myName,myNumber); printf("%d,%s\n",myNumber,myName); fclose(fp); //ファイルを閉じる } |
まず、FILE宣言子を使ってファイルポインターを宣言しています。その後、fopen関数を使ってファイル名"test.dat"というデータファイルを新規作成し開いています。fopen関数の引数は、1番目がファイル名(正しくは、ファイル名の入った文字配列の先頭アドレス)、2番目がファイルのオープンモードです。オープンモードは数種類あり、今回は書きこみなので、書きこみ(WRITE)を示す"w"としています。他のオープンモードについては、この後紹介していきます。fopenでファイルポインターの取得ができれば、ファイル操作をする際、ファイル名を使わずファイルポインターを使います。
ファイルに書きこむ時は、fprintf関数を使います。fprintf関数の引数はprintf関数と似ていますが、違うところは、引数の1番目に書きこみたいファイルへのファイルポインターを指定することです。その他の書式等は、printf関数と同じです。全てのファイル操作が終了したら、fclose関数でファイルを閉じます。 注1)プログラム10-1で作成したファイルは、実行ファイルと同じ場所(フォルダ)に作成されます。
関数説明:fopen,fprintf |
実行結果
画面出力 YamadaKouji 96131028 96131028,Yamada Kouji ファイルに書きこまれた内容
|
実行結果を見てもわかるように、今までprintfで出力していたのと同じようにファイルに書きこまれます。ファイルに書きこんだ数値や文字の順序や区切り文字(スペースかカンマ)は、書きこみのときにはあまり関係ありませんが、読みこみ時に大変重要になるのでここでは、どのようにファイルに書きこんだのかをしっかり覚えておいてください。
それでは、今つくったファイルからデータを読んでみます。
ファイルからデータを読みこむ
さて次は、ファイルからデータを読む方法を紹介します。読みこみは、書きこみよりも注意する点が多いので注意してください。読みこむファイルは、先ほど作成した"test.dat"を使います。
以下のプログラムをみてください。
|
|
#include <stdio.h> #include <string.h> void main(void) { char myName[20]; int myNumber; FILE *fp; //ファイルポインター fp = fopen("test.dat","r"); //ファイルを開く fscanf(fp,"%s%d",myName,&myNumber); //区切り文字スペース printf("%s %d\n",myName,myNumber); //変数の内容をクリアー myNumber = 0; strcpy(myName,""); fscanf(fp,"%d,%s",&myNumber,myName); //区切り文字:カンマ printf("%d,%s\n",myNumber,myName); fclose(fp); //ファイルを閉じる } |
読みこみの時は、fopen関数の2番目の引数に、読みこみ(READ)を示す"r"を指定します。この時ファイルは既に存在している必要があります。もし、存在しないファイルを"r"で開こうとすると、fopen関数はオープン失敗を示すNULLを返します。成功すれば書き込み同様、指定ファイルのファイルポインターを取得でき、そのファイルポインターを使ってファイル操作することになります。
読みこむ時は、fscanf関数を使います。これもscanf関数と似ていますが、一番目の引数に読みこむ対象となるファイルへのポインターを渡します。あとの書式等は、scanf関数と同じです。 読みこみで大切なのは、データの型の並びです。ファイル"test.dat"の1行目は、文字列・数値、区切り文字はスペースですので、fscanf(fp,"%s%d",myName,&myNumber);となります。また、2行目は、数値・文字列、区切り文字はカンマですので、fscanf(fp,"%d,%s",&myNumber,myName);となります。ファイルに書かれているデータの型の並びと、読み取ろうとするデータの型が一致しないと正しくデータを読み取ることができないので、注意してください。 処理が終了すれば、ファイルを閉じることを忘れないようにしましょう。 関数説明:fscanf |
実行結果
YamadaKouji 96131028 96131028,YamadaKouji |
ファイルに追加書きこみする
オープンモード"w"でファイルを開いた場合、既にファイルが存在しているときはファイルの中身を空にし、ファイルが存在しないときはファイルが作成されます。
よって、既に存在しているファイルをオープンモード"w"で開け処理しても追加書きこみしたことにはなりません。既存のファイルに追加書きこみしたい場合は、追加(append)を示す"a"を使用します。このモードでファイルを開き書きこみをすると、ファイルの一番最後から追加書きこみされていきます。もし、ファイルが存在しない場合は新しくファイルが作成されます。
|
|
#include <stdio.h> void main(void) { char appName[]="ShinkichiTamaki"; FILE *fp; //ファイルポインター fp = fopen("test.dat","a"); //ファイルを開く fprintf(fp,"%s\n",appName); fclose(fp); //ファイルを閉じる } |
プログラム10-1で作成したファイル"test.dat"をオープンモード"a"で開き、文字列をファイルに追加書きこみしています。実行結果の太字の部分が追加書きこみされた部分です。
オープンモード"a"は追加書きこみだけではなく、データを読みこむことも可能ですが、ファイル位置はエンド・オブ・ファイル(EOF)に置かれている為、ファイル位置の変更なしにファイルの内容をリードすることはできません。ファイル位置に関しては、後で説明します。 |
実行結果
test.datファイルの内容 YamadaKouji 96131028
|
ファイルの読み書きをする関数は、ここで紹介した関数以外にも数種類あります。全ての使い方を説明することはしませんが、最後にリファレンスとして一部を紹介してありますので、自分で勉強してみてください。
|
|
#include <stdio.h> void main(void) { FILE *ip,*op; char ic; ip = fopen("test.dat","r"); //コピー元ファイル op = fopen("copy.dat","w"); //コピー先ファイル printf("以下の内容をコピーします。\n\n"); while((ic = fgetc(ip)) != EOF) //EOFまで読みこむ { putchar(ic); //画面に読みこんだ文字を表示する fputc(ic,op); //ファイルに1文字書きこむ } fclose(ip); fclose(op); printf("\nコピーが終了しました。\n"); } |
このプログラムでは、10-3で追加書きこみしたファイルの内容を新規ファイル"copy.dat"にコピーするプログラムです。
ファイルポインターを開けるファイルの数だけ用意し、fopen関数で開けます。 読み取りは、fgetc関数を使っています。fgetc関数はファイルより1文字読みこむ関数で、引数は読みたいファイルのファイルポインターです。また、書きこみは、ファイルに1文字書きこむfputc関数を使い、引数は書きこみたい文字と書きこむファイルのファイルポインターです。 プログラム中のEOFとは、エンド・オブ・ファイルのことで、ファイルの終りを表します。よって書きこみは、"test.dat"ファイルの最初からEOFに到達するまで1文字ずつ読み取り、画面と"copy.dat"ファイルに1文字ずつ入力するという仕組みになっています。 最後に、全てのファイルを閉じることを忘れないようにしましょう。 |
実行結果
以下の内容をコピーします。 YamadaKouji 96131028
コピーが終了しました。 copy.datファイルの内容
|