前回(2019/12/20)の内容 ファイル I/O C 言語でファイルの内容を扱う「標準ライブラリ」の使い方 「標準ライブラリ」 C 言語の一部ではないが、C 言語が利用できる環境では、 同一の利用法で、同一の効果が得られる事が保証された形で提供される 「C 言語の『移植性』」を担保する役割を担っている cf. 環境(OS)が異なれば、「同じ役割を持つもの」が「同じに使える」保証がない => もし、「異なる環境では異なるプログラム必要」なら、大変 <= しかし、「その違いを吸収するもの」があれば、 同じプログラムを異なる環境で、「そのまま」利用できる可能性がある => プログラムの移植性 <= プログラミング言語が、なんらかのサービスを提供する必要がある C 言語の場合は、「標準ライブラリ」がそれを担保する !!! 特に C 言語の場合は、「ライブラリ」の比重が大きい => C 言語を活用するためには、(じつは..)標準ライブラリの活用法が不可欠 もうしわけないが、ソフトウェア概論では、そのほんの一部しか触れられない => 言語そのものより、多くの内容がある I/O 位 ( printf/scanf/fopen/fclose ) 数学関係 ( sqrt, sin, cos, etc.. ) => 他にもたくさんある => Call by Need (必要になったら調べる..) fopen でファイルを「開き」、ファイルポインタを入手 "r" で読み込み fgetc を使うと、一文字読みこまれるだけでなく、 次の文字を読みだすように、読み出し位置が一つ進む "w" で書き込み fputc を使うと、一文字書き込まれるだけでなく、 次の文字を書き込めるように、次の書き込み先位置が一つ進む # 開いた瞬間、元の内容は、すべて失われる "a" 追記 基本は、"w" と同じだけど、元のファイルの内容は失われず、 最初に書き込む先が、ファイルの最後になる "+" ランダムアクセスも可能 読みこみ場所や書き出し場所を、fseek を利用して、変更可能 fseek を利用する事により、書き出しや読み込み位置が変更 r+ ( read しつつ、書き込みなども可能なる.. ) ファイルポインタと 「f-関数」を利用して「入出力」 Input: fgetc, fscanf, fgets, ... Output: fputc, fprintf, fputs, ... fclose でファイルを「閉じ」る => これを忘れると、いろいろ厄介な事に... # 特に、書き出しの時に、fclose を忘れると、書き込み結果が保証されない可能性がある # !! windows の場合は、運が悪いと、二度と開けないファイルができたりする [落穂ひろい] 構造体のポインターアクセス 構造体へのポインタ値を利用して、その構造体の要素を参照する場合 例: Point3D *ptp;で x 要素を参照する そのポインタ値に*を付けて、かっこでかこってから、タグ名を付ける (*ptp).x とよいが、その省略記法として、-> を利用してもよい ptp -> x (復習) 動的データ型 => alloc (malloc/calloc) を利用して、実行時に、領域を確保して、データを収める 動的データ型は、「不特定多数の要素からなるデータ(を保存する領域)」を扱う型 例 : 文字列 複数の文字からなっている C 言語では、「文字列」を「文字配列」で表現する <= 「配列」そのものは、基本、静的なので、最大サイズをきめて、 その「範囲内」であつかう => 実行時に、「範囲を超えた」サイズは扱えない <= 動的なアプローチを考える 長さが長くなった時点で、それの領域を動的に確保して、追加する => 具体例 : 文字「リスト」を作る Linked List にする事により、原理的(メモリ量が許す限り..)に いくらでも長い文字列が表現できる