*C言語* 〜49時限目〜 ファイルへのアクセス方法&コマンドライン引数について・・・・
〜目次〜
ランダムアクセスをする
ファイルへのアクセス方法について学んでいきます。
これまでのファイルでは、
ファイルの先頭から順番にデータを読み書きしていました。
このように先頭から順番にファイルを扱う方法のことを、
シーケンシャルアクセス(sequential access)
と呼びます。
ランダムアクセスをするには、
ファイル中のどの位置からデータを読み書きするのかを、
指定する必要があります。
このためには、
データを読み書きしている「現在位置」の概念が必要です。
この位置のことを、
ファイルポジション
と呼びます。
ファイルを任意の場所から読み書きする方法のことを、
ランダムアクセス(random access)
と呼びます。
実際にランダムアクセスを行うコードを入力します。
48時限目で作成した、test113.binファイルを使います。
このファイルについて、指定された部分のデータだけ読み込みます。
sample115.c
ーsample115の実行画面ー
ファイルをオープンしました。
何番目のデータを読み込みますか?
2
2番目のデータは70です。
ファイルをクローズしました。
ランダムアクセスをするには、
fseek( )関数
という関数を使います。
fseekの2番目の引数は、
移動するサイズを指定します。
fseekの3番目の引数は、
開始位置を指定します。
よって、
3番目の引数で指定した開始位置から、
2番目の引数で指定したサイズ分だけ移動することになります。
開始位置には以下の3つの定義済みのマクロがあります。
- SEEK_SET →ファイルの先頭
- SEEK_CUR →現在位置
- SEEK_END →ファイルの末尾
移動したら、その位置からint型のデータを1つ読み取るので、
fread( )関数を使って読み込みます。
コマンドライン引数を使う
これまでのコードでは、
読み書きするファイルは全て、
あらかじめ決められたファイル名でした。
プログラムを実行する際に、
読み書きするファイル名をユーザーが指定できれば、
より便利なプログラムになります。
C言語では、
ユーザーが指定した文字列を実行じに受け取る仕組みとして、
コマンドライン引数(command line argument)
という機能を使うことができます。
コマンドライン引数は、
以下のようなmain( )関数の引数の形で文字列を受け取るものです。
int main(int argc, char *argv[ ]){
・・・
}
上のコードを実行することで、
1番目の引数であるargcには、
ユーザーが入力した文字列の個数が格納されます。
また、
2番目の引数である配列argv[ ]には、
ユーザーが入力した文字列へのポインタが格納されます。
プログラムを実行する際に、
1番目に入力するのはそのプログラム名です。
そのあと、
スペースで区切って2番目、3番目・・・と文字列を続けて入力すると、
それらがmain( )関数の引数として渡されます。
これらの文字列は、
char *argv[ ]という文字列ポインタの配列として扱われます。
実際にこの機能を使ったコードを入力してみます。
以下のようなファイルを1つ作成してください。
このファイルは、コンパイル・リンク後に作成された、
実行プログラム(.exeファイル)と同じディレクトリに用意してください。
sample116.c
ーsample116の実行方法ー
sample116 myF116.txt
ーsample116の実行画面ー
Hello. How are you?
I'm fine thank you!
sample116を実行する際に、
読み書きするファイル名をプログラム名に続けて入力します。
まず引数argcを調べて、
正しい数の引数(文字列)が入力されたかを、
チェックしています。
今回は2つの引数が入力されているべきです。
その後で引数argv[1](ファイル名をあらわす文字列へのポインタ)を
使って今までと同じようにファイルをオープンしています。
このため、
読み込むファイル名が違くても、
プログラムを作成し直さないで済みます。
コマンドライン引数を使うことで、
ユーザーがプログラム実行時に、
情報を与えるプログラムを作成することができるのです。
こうして指定したファイルの内容を、
1文字ずつ読み出すプログラムを作成することができます。
尚、ファイルの1文字の入出力には、
fgetc( )関数、fputc( )関数
を使うことができます。
次回はデバッグの仕組みから学んでいきます。
〜END〜