HIR-NET Home 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集
Tweet このエントリーをはてなブックマークに追加
C言語辞典

getcゲット・シー関数かんすう
getc function

語源  getゲット characterキャラクター(文字出力)
分類  C/C++標準ライブラリ/関数・マクロ/入出力関数/入力関数/文字入力関数
名称  ファイル文字入力マクロ関数(file character input macro-function)
対義  putc関数, fputc関数
同等  fgetc関数, getwc関数
類似  getchar関数
関連  fopen関数
解説  getc関数は、ファイルから文字を読み込む関数(または関数形式マクロ)です。マクロとして実現されている場合があることを除いて、fgetc関数と等価です。

関数原型宣言ヘッダ  <stdio.h>
関数原型宣言例
             入力ストリーム
                 ↓
int getc(FILE *stream);
↓
0~UCHAR_MAX:入力文字
EOF         :失敗
関数返却値
①入力した文字を返す。値としては 0~UCHAR_MAX(一般に 0~255)です。
②ストリームがファイルの終わりである場合は、ファイル終了指示子をストリームに設定し EOF(一般に -1)を返します。
③読込エラーが発生した場合はファイル・エラー指示子をストリームに設定し、EOF(一般に -1)を返します。

落とし穴  EOF検出のため、返却値を代入する変数の型は char, signed char, unsigned char であってはなりません。これは入力される文字の値は unsigned char型の範囲(一般に 0~255)ですが、EOFマクロは負の汎整数型定数(一般に -1)であるからです。

注意  getc関数は、関数ではなくマクロとして実現されている場合もあり、その場合は stream を 2度以上評価される可能性がありますので、stream は副作用がある式であってはなりません。

マクロ定義例1  getc関数が、マクロで実現されている場合の例です。FILE型の宣言例に基づいたものであり互換性はありません。
 この例では s(入力ストリーム)を 2回評価しています。_blevel(バッファ充満レベル)を減少させ、レベルが 0以上(バッファにまだ未参照の文字がある)なら、ファイル位置指示子_fpi を進め、バッファから文字を参照すします(-1 は ++ した後のため)。
 レベルが 0未満(バッファの文字をすべて参照した)なら、処理系定義の_fgetc関数により、バッファを吐き出し(古いバッファを捨て)ファイルから新しいバッファを読み込んだあとで文字を参照します。このとき、_blevel は -充満バッファ量で初期化され、ファイル終了指示子や改行文字の変換の問題も解決されます。
#define getc( /* ファイル文字入力マクロ \
  GET Character */                      \
/*                                      \
 * 0~UCHAR_MAX:入力文字                \
 * EOF         :入力失敗                \
 */                                     \
s) /* 入力ストリーム  Stream */         \
  ((--((s)->_blevel)>=0)                \
  ?(unsigned char)(++(s)->_fpi)[-1]     \
  :_fgetc(s))

マクロ定義例2  getc関数が、インライン展開のためのマクロとして実現されている場合の例です。もちろん、インライン展開機能を持つ処理系が行う定義の例です。この場合 s の評価は 1回です。
#define getc(s)  _BUILTIN_getc(s)

関数定義例  putc関数が、関数として実現されている場合の例です。
// getc.c

#include <stdio.h> // FILE,fgetc
#undef getc // マクロ定義取消


int getc( // ファイル文字入力関数
//  GET Character
// 0~UCHAR_MAX:入力文字
// EOF         :入力失敗
FILE *stream) // 入力ストリーム
{
  return fgetc(stream);
} // getc


 プログラム例   

1文字ずつのファイル内容表示
ファイルから1文字ずつ読み込み、内容を表示するプログラムです。
// getc1.c

#include <stdio.h> // FILE,EOF,fopen,getc,putchar
#include <stdlib.h> // EXIT_SUCCESS


main(int argc,char *argv[])
{
  FILE *sget; // 入力ストリーム Stream GET
  sget=fopen(argv[1],"r");

  while(1)
  {
    int c=getc(sget);
    //[解説]EOF検出のため char は不可
    if(c==EOF)break; // ファイル終了
    putchar(c); // 文字表示
  } // while

  return EXIT_SUCCESS;
} // main
実行結果
>>type getc.tes⏎ …… ファイルの内容確認
abcdefg
123

>>getc1 getc.tes⏎
abcdefg
123

>>■





HIR-NET Home 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集
◆リンクは、ご自由にお張りください。

Copyright © 1988-2017 Hirabayashi Masahide  プライバシーポリシー