Contents
FileRead_scanf関数の概要
FileRead_scanf関数の説明
DXライブラリではファイルからデータを読み込むための関数が複数用意されている。
その中でFileRead_scanf関数は決められた書式に則ったデータの読み込みに役立つ。
使いどころが限られるが、それで済む用途であれば効果的だ。
なお、他のファイル読み込み関数と同様にDXアーカイブファイルからの読み込みにも対応している。
FileRead_scanf関数の不具合
古いDXライブラリではFileRead_scanf関数に不具合があった。
書式文字列で%sを指定した際、正常に動作しないという不具合は2015年9月26日に公開されたバージョン3.15bで修正済みとなった。
古いバージョンのDXライブラリを使用している場合は注意すること。
更に古いバージョンで別の不具合もあったが、2008年のことなので今となっては関係ないだろう。
不具合情報追記
2016年6月9日追記
ファイルの最後の1文字が無視されてしまうバグは2016年6月5日に公開されたバージョン3.16cで修正された。
記事執筆時の時点では不具合があったので、最新バージョンなら一部不要な情報になっていることに注意すること。
FileRead_scanf関数の使い方
ファイル読み込みの準備と後始末
FileRead_scanf関数を使う前にFileRead_open関数でファイルを開き、ファイルハンドルを取得する必要がある。
必要な処理が終わったら後始末のためFileRead_close関数でファイルを閉じなくてはならない。
FileRead_scanf以外のファイル読み込み関数を使う場合も同様だ。
FileRead_scanf関数の宣言
FileRead_scanf関数は次のように宣言されている。
int FileRead_scanf( int FileHandle , char *Format , ... );
ファイルハンドルと読み込ませるための書式を指定すればいい。
戻り値は-1ならエラーで、それ以外なら読み出した文字数になる。
書式の指定は公式サイトのリファレンスに詳しいことは載っていないが、C言語の標準関数のfscanfと同様の機能を有している。
FileRead_scanf関数の書式の指定方法
基本的な書式の指定方法
全ての指定方法を説明できるほど詳しくないので使うであろうもののみ抜粋する。
- %s 文字列
- %d 整数
- %f 小数
カンマで区切る場合の指定方法
気をつけなくてはならない問題として、「カンマで区切る」場合が挙げられる。
カンマも文字列の一部として解釈されてしまうため、少々特殊な指定方法が必要となる。
- %[^,] ,以外を読み込む
このように%[^,]を指定すればカンマを区切りとする文字列として読み込まれる。
カンマ以外を読み込ませるという指定なので、他の文字に替えれば異なる区切り文字を指定できる。
2バイト文字を区切り文字として指定したが無事動作することを確認した。
実際に使うことはないと思うが正常に動作するとは驚きだ。
FileRead_scanf関数の不親切なサンプルコード
サンプルコードの前後を思いっきり省略しているが許してほしい。
でも十分なヒントにはなるはずだ。
半角スペース区切りのサンプル
半角スペース区切りで読み込ませる場合は次のようになる。
FileRead_scanf(fileHandle, "%s %d %d", str, &i1, &i2);
カンマ区切りのサンプル
カンマ区切りを読み込ませるコードは次のようになる。
FileRead_scanf(fileHandle, "%[^,],%d,%d", str, &i1, &i2);
FileRead_scanf関数を使う場合の注意点
数値として読み込ませる場合は変数名の前に「&」を付ける。
残念ながら私の知識では詳しい説明をすることができないので、そういったものだと思うしかない。
それと読み込ませるファイルの最後がどうなっているかによって想定していない動作をするかもしれない。
実際に使う場合にはテストして挙動を把握すること。
怪しいポイントは改行しないでファイルが終わっている場合。
最後に何もない行を加える場合は何もない行なのか判定したり読み込みエラーの対処をする。
同様の処理をfscanf_s関数で試してみたが、その挙動はFileRead_scanf関数とは異なっていた。
蛇足ながら2バイト文字での区切りでも想定していた動作とは異なっていた。
FileRead_scanf関数が実際にどう動作するのか気をつけること。