C言語関数:fscanf





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■fscanf
streamからの書式付き入力

【分類】
標準入出力/ストリーム関数

【書式】
int fscanf(FILE *stream, const char *format, ...);

【パラメータの型と説明】

パラメータ説明
FILE *streamファイルポインタ(ストリーム)
const char *format書式文字列

【機能説明】
streamで指定されたストリームからデータを書式付きで読み込みます。
ストリームからデータを読み込む以外は、scanf関数と同じ機能です(scanf関数を参照してください)。

fscanf()関数の使用例です。
「test.txt」というファイルの内容を読み込むプログラムです。 実行する前に、ファイルを作成しておく必要があります。 次のコマンドでファイルを作成してください。 「91O」の部分は数字のゼロ「0」ではなく英文字のオー「O」を入力してください。

C:\StudyC\MyProg>echo 123 456 789>test.txt

C:\StudyC\MyProg>echo 91O 1112>>test.txt

C:\StudyC\MyProg>type test.txt
123 456 789
91O 1112

これで読み書き可能な(普通の状態)ファイル「test.txt」が作成されました。
※echoコマンドは画面に文字列を表示するものです。 他の多くのコマンドでも同じですが、最後に「>ファイル名」を指定すると画面に表示される内容がファイルに書き込まれます。 また、「>>ファイル名」とするとファイルに追記されます。

#include <stdio.h>

main()
{
        FILE    *fp;
        char    buff[100+1];
        int     rc;
        int     value;
        int     i;

        fp = fopen("test.txt", "r");
        if (fp == NULL)
        {
                printf("ファイルオープンエラー\n");
                return;
        }

        for ( ; ; )
        {
                rc = fscanf(fp, "%d", &value);
                if (rc != 1)
                {
                        printf("読み込みデータなし\n");
                        break;
                }
                else
                {
                        printf("fscanf:%d\n", value);
                }
        }
        fclose(fp);
}

実行結果は以下になります。

fscanf:123
fscanf:456
fscanf:789
fscanf:91
読み込みデータなし

1.fopen()関数で「test.txt」ファイルをオープンします。
「ファイルオープンエラー」と表示される場合は、事前にファイルが作成できていない可能性があるので確認してください。
2.forループで以下の処理を繰り返し行います。
3.fscanf()関数でファイル「test.txt」からint型の値を1個読み込みます。
4.fscanf()関数が1以外の値を返した場合は「読み込みデータなし」と表示してforループを終了します。
5.fclose()関数でファイルをクローズします。

このプログラムの実行例では、「91O」の部分の「91」まで読み込んで処理を終了してしまっています。
fscanf()関数で「%d」を指定しているため数値以外の文字は読み込みを行いません。
エラー処理に使う情報も何アイテム読み込んだかしかありません。

このようなことから、fscanf()関数では十分なエラー処理ができません。 またエラー個所をユーザーに知らせることも簡単にはできません。
数値の入力ならば、fgets()関数とstrtol()関数などを使うようにしましょう。

【参照関数】
scanf
sscanf