次にテキストファイルの読み込み操作を見ていきます。
読み込み処理の例題1
この例題では
asset/sample.txt の内容を一行ずつ読み込んで文字列に詰め、詰め込んだ内容を表示する
という事を行います。
sample.txt
abcdef
大まかな手順は下記のとおりです。
- fopen_s 関数で指定したファイルを指定したモードで開き、変数fpで操作できるようにする
- fgets 関数で内容を一行ずつ読み取っていき、buffer に詰めてコンソールに表示する
- fclose 関数でファイルを閉じる
#include
// エントリー関数
int main(void)
{
// ファイル構造体を扱うポインタ変数宣言
FILE* fp = NULL;
// プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
// 開くことに失敗した場合は、エラーを表示する
if (0 == fopen_s(&fp, "asset/sample.txt", "r"))
{
// 読込先の文字配列
char buffer[256] = {};
// fgets で一行毎に文字を配列に詰め込む
while (NULL != fgets(buffer, 256, fp))
{
// 詰め込んだ内容を表示する
printf("%s", buffer);
}
// 閉じる
fclose(fp);
}
else
{
printf("ファイルがありません\n");
}
return 0;
}
順にみていきましょう。
①fopen_s 関数で指定したファイルを指定したモードで開き、変数fpで操作できるようにする
下記コードがその個所となります。
// ファイル構造体を扱うポインタ変数宣言
FILE* fp = NULL;
// プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
// 開くことに失敗した場合は、エラーを表示する
if (0 == fopen_s(&fp, "asset/sample.txt", "r"))
読み込みなので、モードは「r」を指定しています。
サンプルでは失敗した場合の対応も行っています。
② fgets 関数で内容を一行ずつ読み取っていき、buffer に詰めてコンソールに表示する
下記コードがその個所となります。
// 読込先の文字配列
char buffer[256] = {};
// fgets で一行毎に文字を配列に詰め込む
while (NULL != fgets(buffer, 256, fp))
{
// 詰め込んだ内容を表示する
printf("%s", buffer);
}
読み取り開始の現在位置はfpが持ち、fgets 関数が成功すると、
読み取った分だけ、変数fpが持つ読み取り開始の位置を進めてくれます。
その為、戻り値が NULL (EOFに到達 or 読み取りに失敗)になるまで、
while で読み取りを繰り返すといった事が可能になります。
③ fclose 関数でファイルを閉じる
下記コードがその個所となります。
// 閉じる
fclose(fp);
ファイルは使い終わると必ず fclose で閉じるようにしてください。
読み込み処理の例題2
この例題では
asset/sample.txt の内容を指定のフォーマットに合わせて読み取り、変数に詰め込んだ内容を表示する
という事を行います。
sample.txt
1 aaaa 1.7 3 bbb 3.4
大まかな手順は下記のとおりです。
- fopen_s 関数で指定したファイルを指定したモードで読み込み、変数fpで操作できるようにする
- fscanf_s 関数で指定したフォーマットで内容を読み取り、各変数に詰めてコンソールに表示する
- fclose 関数でファイルを閉じる
#include
// エントリー関数
int main(void)
{
FILE* fp = NULL;
// プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
// 失敗した場合はエラー表示
if (0 == fopen_s(&fp, "asset/sample.txt", "r"))
{
// 読込先の整数変数
int no = 0;
// 読込先の文字配列
char string[256] = {};
// 読込先の浮動小数変数
float value = 0;
// fscanf_s でフォーマットを指定して読み取る
while (EOF != fscanf_s(fp, "%d %s %f ", &no, string, 256, &value))
{
// 読み込んだ内容を表示する
printf("%d,%s,%1.2f\n", no, string, value);
}
// 閉じる
fclose(fp);
}
else
{
printf("ファイルがありません");
}
return 0;
}
①と③は同じである為割愛します。
②fscanf_s 関数で指定したフォーマットで内容を読み取り、各変数に詰めてコンソールに表示する
下記コードがその個所となります。
// 読込先の整数変数
int no = 0;
// 読込先の文字配列
char string[256] = {};
// 読込先の浮動小数変数
float value = 0;
// fscanf_s でフォーマットを指定して読み取る
while (EOF != fscanf_s(fp, "%d %s %f ", &no, string, 256, &value))
{
// 読み込んだ内容を表示する
printf("%d,%s,%1.2f\n", no, string, value);
}
fscanf_s 関数で注目するべきは第二引数以降です。
第二引数で、読み取るテキストのフォーマットをそれぞれ指定します。
第三引数以降で、フォーマットに対応した型の変数のアドレスを指定します。
文字列として変数に受け取る際は、受け取る文字列の最大数も指定する必要があります。
どのフォーマットがどんな構成でテキストファイルに入っているのかを、
正しく把握しておかなければならない点に注意してください。
読み取った分だけ、fpが持つ読み取り開始の位置を進めてくれます。
戻り値はファイルの終端であれば EOF それ以外は読み取った個数になります。