スポンサーリンク

ファイルの読み込み・書き込み

ファイルの読み込み

ファイルを読み込むソースを勉強してみたいと思います。
【 <stdlib.h>  】ヘッダに付いては【 exti 】関数を使うため宣言しています。他の関数に付いてはstdio.hに含まれるものです。

プログラムソースを保存する任意のフォルダーに、任意のファイル名で構わないのでtxtファイルを作成して保存してください。

サンプルソースコード

<stdlib.h>はexit関数を使用する為宣言しています。

#include <stdio.h>
#include <stdlib.h>int main(void)
{
FILE *fin;char buf[256];
char filename1[20];printf(“ファイル名を入力して下さい=”);
gets(filename1);fin=fopen(filename1,”r”);
if(fin == NULL){printf(“%sがオープンできません\n”,filename1);
exit(1);
}while(fgets(buf,256,fin) != NULL){
printf(“%s”,buf);
}fclose(fin);return 0;
}

ファイル読み込みサンプルソースコードの説明

【 #include<stdlib.h> 】宣言をして、標準の一般関数を使えるようにします。
ファイルを開いて、読み込みを行い、最後は必ず閉じる。と言う流れです。
まず初めにファイルポインタ:特別なのデーター型変数宣言【 FILE 】に付いて
ファイルポインタ名は任意のものでOKです。例【 FILE *file; 】(*アスタリスクはファイルポインタ名の手前に必ず必要です。)

一つのサンプルに書ききれないので分割して説明↓

ファイルを管理&読み込み用に開くと言う命令文

ファイルポインタ【 fin 】で リード用に開いたファイルを管理。

エラー処理、開いたファイルがエラーの場合【 exit(1); 】でプログラムを強制終了させる条件。

開いたデーターを表示させるソース、開いたファイルを一行づつ読み込んで【 fgets 】出力するソースです。

開いたファイルは必ず閉じます【 fclose(fin); 】

実行結果

ファイルに書き込みサンプルソース

ファイルの読み込みソースコードを改良したファイルに書き込むプログラムを勉強してみたいと思います

#include <stdio.h>
#include <stdlib.h>int main(void)
{
FILE *filein,*fileout;
char buf[256];
char fil1[20],fil2[20];printf(“入力ファイル名=”);
gets(fil1);printf(“出力ファイル名=”);
gets(fil2);filein=fopen(fil1,”r”);
if(filein == NULL){
printf(“%sがオープンできません\n”,fil1);
exit(1);
}fileout=fopen(fil2,”w”);
if(fileout == NULL){
printf(“%sがオープンできません\n”,fil2);
exit(1);
}while(fgets(buf,256,filein) != NULL){
fputs(buf,fileout);
}fclose(filein);
fclose(fileout);return 0;
}

ファイル書き込みソースコードの説明

【 #include<stdlib.h> 】宣言をして、標準の一般関数を使えるようにします。
ファイルを開いて、読み込みを行い、最後の【 while 】ループ条件に【 fputs 】関すを使用して、書き込み用に開いたファルポインタ【 fileout 】で管理する【 file2 】に一行ずつ繰り返し書き込む点に注目して下さいね。

実行結果、コピー先のファイルは存在しなくてOKです。イメージ的にはtest.txtファイルを新規にcpy.txtと言うファイル名でコピーしたイメージです。

ファイルを一行づつ入力保存ソース

ファイルの入出力について説明させて頂きました、今回もう少しいろんな関数も絡めて説明させていただきたいと思います。
前回説明分参照は←メニューの【 ファイルの読み込み 】【 ファイルの書き込み 】【 コメントを書いてみるのファイル出力 】

ファイルの操作は【 FILE *任意のポインタ名 】ファイルポインタを利用する点と、【 fopen() 】ファイルを開く【 fclose() 】ファイルを閉じるの点に気をつけると理解しやすいと思います。特に【 fopen() 】ファイルを開く場合”r”(read)読み込みなのか”w”(writ)書き込みなのかの部分に注目みるといいと思います。

例:testfile.txtと言うテキストファイルを読み込みしたいとします。
※ヘッダ宣言・メイン関数等は省略しております。
【 file=fopen(“testfile.txt”,”r”); 】書き込みたい場合は”r”を指定
※tesifaile.txtと言うファイルが存在しない場合はエラーになります。

#FILE *file;
file=fopen(“testfile.txt”,”r”);
/*任意の実行文*/
fclose(file);

すべてのソースコードに当てはまるので注意

もし万が一指定したファイルが見つからない場合はエラー(NULL)になります。
その場合プログラムが暴走しかねないので、念の為強制終了分を付け加えるのが基本になります。

【 if(file==NULL)exit(1); 】戻り値が(NULL)エラーの場合はexit(1)でプログラムの実行を終了するの分です。

#FILE *file;
file=fopen(“testfile.txt”,”r”);
if(file==NULL)exit(1);
/*任意の実行文*/
fclose(file);

【 if(file==NULL)exit(1); 】戻り値が(NULL)エラーの場合はexit(1)でプログラムの実行を終了するの分です。

#FILE *file;
file=fopen(“testfile.txt”,”r”);
if(file==NULL)exit(1);
/*任意の実行文*/
fclose(file);

【 if(file==NULL)exit(1); 】戻り値が(NULL)エラーの場合はexit(1)でプログラムの実行を終了するの分です。

#FILE *file;
file=fopen(“testfile.txt”,”w”);
if(file==NULL)exit(1);
/*任意の実行文*/
fputc(‘A’,file);
fputc(“あ”,file);
fputs(‘ABCdefg’,file);
fputs(“あかかげまる”,file);
fclose(file);

繰り返し任意のテキストファイルに複数行出力させる サンプルソース

今回のサンプルは【 while(1) 】無限ループを使って、繰り返し任意のテキストファイルに、複数行出力させて見たいと思います。
サンプル(ソースをコピーしてメモ帳に貼り付けしコンパイルできます。)

#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE *fi;
char finm[80];
char ss[80];printf(“保存ファイル名をtxt形式で指定して下さい:”);
gets(finm);

fi=fopen(finm,”w”);
if(fi==NULL){
printf(“%sがオープンできません.\n”);
exit(1);
}

while(1){
printf(“文字を入力して下さい:”);
gets(ss);
fputs(ss,fi);

fputc(‘\n’,fi);

printf(“\n”);

if(ss[0]==0)break;
}

fclose(fi);

return 0;
}

ソースコードの解説、肝心な記述は上記で説明済みなので図には記載しておりません。
【 FILE *fi 】ファイルを扱う際に必要なファイルポインタ(任意のものでOKです)を一つ宣言します。
文字列型配列【 charfinm[任意の配列数] 】はファイル名の書き出しように用意【 charss[任意の配列数] 】は任意の文字列を書き込み(出力)する為に用意しております。
【 fi=fopen(finm,”w”) 】の部分を最初から用意したファイルを指定する場合は【 fi=fopen(“任意のファイル名.txt”,”w”) 】とすればOKです。
【 while(1) 】無限ループは変数配列【 ss 】の「ss[0]」に文字列終端マーク「0」が代入されると【 exit(1) 】でループを終了させております。プログラム実行中に、「未入力」すると必然的に配列のss[0]に0が代入されループは終了し作業完了となります。

 

出力結果
作成するファイル名は任意のものでOKです。新規に作成されます。
一行入力欄に未入力で実行(Enterキー)すると文字終端マーク0が代入されループ終了となります。
出力処理結果を見るには通常通りフォルダを開いて確認してもOKですし。
コマンドラインからそのまま【 type 任意のファイル.txt 】とすれば出力内容を確認することが出来ます。

繰り返し任意のテキストファイルに複数行出力させる追記処理

上記の【 if=fileopen(finm,”w”); 】は出力処理になるのですが、同一ファイルを処理すると上書きされ前のデータは残りません。前のデーターに追記上書きする方法は”w”を”a”とすれば追記処理が出来ます。
【 if=fileopen(finm,”w”); 】→【 if=fileopen(finm,”a”); 】
“a”追記用にファイルを開き処理するのと、指定したファイルがない場合は新規に作成され出力しょりされます。
※処理内容は上記までの説明と同じですが、追記型になります。

#include <stdio.h>
#include <stdlib.h>int main(void)
{

FILE *fi;
char finm[80];
char ss[80];

printf(“保存ファイル名をtxt形式で指定して下さい:”);
gets(finm);

fi=fopen(finm,”a”);
if(fi==NULL){
printf(“%sがオープンできません.\n”);
exit(1);
}

while(1){
printf(“文字を入力して下さい:”);
gets(ss);
fputs(ss,fi);

fputc(‘\n’,fi);

printf(“\n”);

if(ss[0]==0)break;
}

fclose(fi);

return 0;
}

 

コメント

タイトルとURLをコピーしました