TPY ENGINEERING VLOG

TPY ENGINEERING VLOG(C,JAVA)

*C言語* 〜49時限目〜 ファイルへのアクセス方法&コマンドライン引数について・・・・

〜目次〜

 

 

 

 

ランダムアクセスをする

ファイルへのアクセス方法について学んでいきます。

これまでのファイルでは、

ファイルの先頭から順番にデータを読み書きしていました。

このように先頭から順番にファイルを扱う方法のことを、

シーケンシャルアクセス(sequential access

と呼びます。

ランダムアクセスをするには、

ファイル中のどの位置からデータを読み書きするのかを、

指定する必要があります。

このためには、

データを読み書きしている「現在位置」の概念が必要です。

この位置のことを、

ファイルポジション

と呼びます。

ファイルを任意の場所から読み書きする方法のことを、

ランダムアクセス(random access

と呼びます。

実際にランダムアクセスを行うコードを入力します。

48時限目で作成した、test113.binファイルを使います。

このファイルについて、指定された部分のデータだけ読み込みます。

sample115.c

f:id:YuyaTerayama:20180918020508p:plainーsample115の実行画面ー

ファイルをオープンしました。

何番目のデータを読み込みますか?

2

2番目のデータは70です。

ファイルをクローズしました。

ランダムアクセスをするには、

fseek( )関数

という関数を使います。

fseekの2番目の引数は、

移動するサイズを指定します。

fseekの3番目の引数は、

開始位置を指定します。

よって、

3番目の引数で指定した開始位置から、

2番目の引数で指定したサイズ分だけ移動することになります。

開始位置には以下の3つの定義済みのマクロがあります。

  1. SEEK_SET   →ファイルの先頭
  2. SEEK_CUR   →現在位置
  3. 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つ作成してください。

f:id:YuyaTerayama:20180918022150p:plainこのファイルは、コンパイル・リンク後に作成された、

実行プログラム(.exeファイル)と同じディレクトリに用意してください。

sample116.c

f:id:YuyaTerayama:20180918024034p:plainーsample116の実行方法ー

sample116 myF116.txt

ーsample116の実行画面ー

Hello. How are you?

I'm fine thank you!

sample116を実行する際に、

読み書きするファイル名をプログラム名に続けて入力します。

まず引数argcを調べて、

正しい数の引数(文字列)が入力されたかを、

チェックしています。

今回は2つの引数が入力されているべきです。

その後で引数argv[1](ファイル名をあらわす文字列へのポインタ)を

使って今までと同じようにファイルをオープンしています。

このため、

読み込むファイル名が違くても、

プログラムを作成し直さないで済みます。

コマンドライン引数を使うことで、

ユーザーがプログラム実行時に、

情報を与えるプログラムを作成することができるのです。

こうして指定したファイルの内容を、

1文字ずつ読み出すプログラムを作成することができます。

尚、ファイルの1文字の入出力には、

fgetc( )関数、fputc( )関数

を使うことができます。

 

次回はデバッグの仕組みから学んでいきます。

 

〜END〜