-

Standard Libraries

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

標準入出力

C言語は言語自体にI/O機器を指定していません。I/Oはむしろライブラリルーチンを介して実現されます。実用的には、特定のアプリケーションのためにI/Oをカスタマイズする可能性が与えられた、他の言語よりも決して不便ではないI/Oであるという結果になっています。

例えば、(標準入力から1文字取得する)標準のgetchar()を特別なgetchar()と入れ替えるルーチンを例にとって見ましょう。これは確かに、特別なハードウェア設定の上で動くコードを書くときには便利ですが、高レベルの互換性の"標準"CのI/Oではどうでしょうか?

実際に、ポータブルなI/Oのルーチンセットを定義した、標準I/Oライブラリ(STDIO)があります。これらはどのC言語アプリケーションプログラムから、普通に使用されるルーチンです。これらのルーチンは他のI/Oでないライブラリルーチンと共に、この後に続くマニュアルの章でリストアップされています。

互換性

HI-TECH Cで提供されるライブラリはは標準I/Oレベル、UnixシステムコールレベルでUnix V7 ライブラリやANSIライブラリと高い互換性を持っています。

関数のようなUNIXシステムコールを実装したライブラリルーチンは、これらのシステムコールに近づけることができますが、link()操作などいくつかのUnixシステムコールは他のシステムではシミュレートできません。

とはいえ、open, close, read, write, lseekといった基本的な低レベルのI/OルーチンはUnixでの相当物と同一です。これはUNIX上で実行するように書かれたプログラムが、HI-TECH Cでコンパイルすると、標準I/Oを使っていなくても最小限の変更で実行できるということを意味します。

組み込みシステム用のライブラリ

オペレーティングシステムのないターゲットシステム用にデザインされ、コードを生成するクロスコンパイラは、STDIO関数のサブセットを実装したライブラリが提供されます。ファイルを扱う関数は提供されません。 printf(), scanf()などがインクルードされます。これらは文字をシリアルポートを介して送ったり受け取ったりするのに典型的な、putchgetch()の2つの低レベルの関数で処理されます。

オンボードUARTを持つシングルチップの小さな、コンパイラで使うのを目的としています。これらの全ての関数のソースコードは、他のシリアルポートからユーザーが変更できるようにして?提供されます。

バイナリI/O

いくつかのオペレーティングシステム、特にCP/Mにおいては、ファイルがASCII(つまり表示できる)内容か、それともバイナリデータか、によって扱いが変わります。MS-DOSではこの問題に悩まされますが、オペレーティングシステムの何らかの欠陥によるものではなく、

むしろ、CP/Mからの残存物、ファイル末尾の過剰なctrl-Zの方でしょう。 残念なことに、ファイルがどちらのタイプのデータを含むか判定する方法はありません(もしかしたら名前やファイルの型によってわかるかもしれませんが、信頼性がありません)。

この困難を乗り越えるために、追加のモード文字列をfopen()コールをインクルードすることができます。ASCII I/Oでファイルを開く場合、fopen()の書式は次の通りです。

fopen("filename.ext", "r")      /* for reading */
fopen("filename.ext", "w")      /* for writing */

バイナリI/Oでファイルを開く場合、文字'b'を付け加えます。

fopen("filename.ext", "rb")
fopen("filename.ext", "wb")

追加の文字はSTDIOライブラリにファイルが厳密にバイナリ形式で扱われることを指示します。CP/MもしくはMS-DOSではでは、ASCIIモードで開かれるファイルは次のSTDIOルーチンによって扱われる特別なキャラクタハンドリングを持ちます。

newline
('\n')が表示の際にキャリッジリターン/新しい行に変換されます。
return
('\r') が入力の際に無視されます。
Ctrl-Z
入力の際にEnd-Of-Fileとして中断されます。またCP/Mの場合のみ、ファイルを閉じるときに付加されます。ASCIIファイルに対して行われる特別なアクションは、他のプログラムがテキストファイルを扱う際に互換性のあるフォーマットで書かれることを確実にしますが、ユーザープログラムからスペシャルハンドリングの要求がない場合、ファイルはユーザープログラムにとって、UNIXライクなテキストファイルに見えます。
バイナリモードでファイルが開かれた場合、これらの特別なアクションは、行われません。これはいかなる種類のバイナリデータを扱うときにも必要で、うわべだけのバイトは挿入されず、また早まった複数のEOFは見られません。
バイナリモード文字列はノーマルモード文字列に加え、使用法はとてもUNIX Cと互換性があります。UNIXでコンパイルされる場合、追加の文字列は無視されます。

ここで言及する'stream'という単語は適切です。streamはSTDIOライブラリルーチンと関連して、ルーチンに扱われるデータバイト(文字)の送り側、または受け側の手段となります。従って引数としてSTDIOに与えられたFILEポインタは対応するstream上のハンドルとしてみなされます。

streamはデバイスやファイルや、その他不特定のソースから。発生。もしくはそれらのデバイスに送られる特徴のない、データバイトの続きに見えます。

FILEポインタはopen(), close(), read(), write()などの低レベルI/O関数とともに使われる'ファイルデスクリプタ!と混同してはいけません。これらは、ファイルへのバッファされない読み書きを行うI/Oの独立したグループを形成します。

不動小数点ライブラリ

HI-TECH Cは言語の一部として、不動小数点を提供しますが、Z80はsingleのプレシジョンのみを提供します。doubleの不動小数点は許可されますが、違いはありません。さらに、標準ライブラリのLIBC.LIBは不動小数点ルーチンを1つも持っていません。

これらは他のライブラリであるLIBF.LIBに分離されました。これの意味するところは、もし。リンクされるライブラリの中に不動小数点をサポートするルーチンがない場合、これが使われない場合には、不動小数点サポートのためのサイズのペナルティー回避します??これはとくにprintfとscanfに重要で、そのため、LIF.LIBはprintfとscanfの不動小数点をサポートするバージョンを含みます。

従って、不動小数点が使用される場合、Cコマンドへのソースとオブジェクトファイル"の後に"-LFオプションを使うべきです。

C -V -O x.c y.c z.obj -LF