はじめての C

(続き)

ファイルを format するために、それを 助ける 特別な 関数が いくつか 用意されています。

  fgetc(), fputc(), fgets(), fputs()

はじめの 2つは 文字を 1つ 読み込み 保持するもので、その他は 全部の 配列分を 処理します。

以下の コードで 考えてみましょう。

  char letter;
int x;
letter = fgetc(pointer);
letter = 'Q';
x = fputc(letter, pointer);

fgetc() は、ファイルにある、可変ポインタが 指している 次の文字を 返します。 または、問題が 起こったときには、マクロの EOF に 等しい 数値を 1つ 返します。

fputc() は、なにも なければ ファイルに 保持していた 文字を 返します。 でも、さきほどと 同じく、なにか 失敗したときには EOF を 返します。

fgets() と fputs() は 同じく 行に 沿って 動きますが、1回の 操作で 文字列を 読み込み 保持します。

  int x;
static char string[] = "Hello world";
x = fputs(string, pointer);

このコードでは、"Hello world" という 文字列を、ポインタが 指す先の ファイルに コピーします。 関数が 働いていれば、x の 値は 正になり、エラーだと EOF を 返します。

この関数の 大きく 違っている点は、文字列の 終わりに 改行と ナル文字を 付け加えないことです。 もちろん それが 必要なら、そうするのは 自由ですが。

  char string[50];
int length = 50;
fgets(string, length, pointer);

関数 fgets() は、ポインタで 特定された ファイルから 文字列を 読むよう 試みます。 そして 改行文字 か EOF まで 着いたときか、または length - 1 個分の 文字を 読み終わったときに 止まります。

これらの 条件の 1つに あっていれば、その後 メモリ上の 文字列は ナル文字を つけて 終了します。 この関数は ファイルの 終わりを 見つけると、NULL を 返します。

今まで 学んだ 他のものと 組み合わせて、次に 記す random access data の テクニックを 用いて、簡潔な segment で データを 処理することが できます。

なんだか ヤヤコシクなってきたので、ちょっと manpage を 写してみます。

int fgetc(FILE * stream);

fgetc() は stream から 次の文字を unsighned char として 読み int に キャストとして 返す。 ファイルの 終わりや エラーと なった場合は EOF を 返す。

int fputc(int c, FILE *stream);

fputc() は、キャラクタ c を unsigned char に キャストし、stream に 書き込む。

int fputs(const char *s, FILE *stream);

fputs() は、文字列 s を stream に 書き込む。 文字列に 続く '\0' は 出力しない。

(返り値) fputs() は 成功すると 負ではない 数を、エラーが 発生した場合は EOF を 返す。

char *fgets(char *s, int size, FILE *stream);

fgets() は、size よりも 1文字 少ない文字を stream から 読み込み、s で 示される バッファに 書き込む。 書き込みは EOF または 改行文字を 読み込んだ後 終了する。 改行文字は 読み込まれると バッファに 書き込まれる。 '\0' 文字が バッファの中の 最後の文字の 後に 1文字 書き込まれる。

(返り値) fgets() は 成功すると s を 返し、ファイルの 終わり あるいは エラーの場合 NULL を 返す。

こうしてみると、C での 文字列 string の 扱いには、独特の クセが ありますネ。