HIR-NET Home C言語 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集

putcプット・シー関数かんすう
putc function

語源  putプット characterキャラクター(文字出力)
分類  C/C++標準ライブラリ/関数・マクロ/入出力関数/出力関数/文字出力関数
名称  ファイル文字出力マクロ関数(file character output macro-function)
対義  getc関数, fgetc関数
同等  fputc関数, putwc関数
類似  putchar関数
関連  ungetc関数
解説  putc関数はファイルに文字を書き出す関数(又は関数形式マクロ)です。マクロとして実現されている場合があることを除いて、fputc関数と等価です。
 出力ストリーム*stream のファイル位置指示子の位置に、出力文字c を unsigned char に変換した上で書き出します。ファイル位置指示子はその分進められます。ファイルが位置付け要求を実現できないか、ストリームが追加モードでオープンされている場合は出力ストリームに文字が付加されます。

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

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

マクロ定義例1  putc関数が、マクロで実現されている場合の例です。FILE型の宣言例に基づいたものであり互換性はありません。
 この例では s(出力ストリーム)を 2回評価しています。_blevel(バッファ充満レベル)を増加させ、レベルが 0未満(バッファに余裕がある)なら、ファイル位置指示子fpi を進め、c(文字)をバッファに書き出します(-1 は ++ した後のため)。
 レベルが 0 以上(バッファがいっぱい)なら、処理系定義の _fputc関数により、バッファを吐き出した(ファイルに書き出した)あとで、その文字を書き出します。このとき、_blevel は -bsize で初期化され、改行文字の変換の問題も解決されます。
#define putc( /* ファイル文字出力マクロ */ \
/*                                         \
 * EOF=出力文字c(0~UCHAR_MAX)            \
 * EOF≠失敗                               \
 */                                        \
c, /* 文字  Character */                   \
s) /* 出力ストリーム  Stream */            \
  ((++((s)->_blevel)<0)                    \
  ?(unsigned char)((++(s)->_fpi)[-1]=(c))  \
  :_fputc((c),s))

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

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

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

int putc( // ファイル文字出力  PUT Character
// EOF≠出力文字c(0~UCHAR_MAX)
// EOF=失敗
int        c, // 文字  CharacterFILE *stream) // 出力ストリーム
{
  return fputc(c,stream);
} // putc


 プログラム例   

1文字ずつのファイルコピー(その1)
putc1.c と putc2.c は同じ動作をするプログラムで、ファイルを1文字ずつコピーします。ファイルの扱いの基本となるプログラムです。fputs関数の解説のページに1行ずつコピーするプログラムがあります。
// putc1.c

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


int main(int argc,char *argv[])
{
  FILE *sget=fopen(argv[1],"r"); // 入力
  FILE *sput=fopen(argv[2],"w"); // 出力

  while(1)
  {
    int c=getc(sget); // ファイル文字入力
    if(c==EOF)break; // ファイル終了
    putc(c,sput);  // ファイル文字出力
  }// while

  return EXIT_SUCCESS;
} // main
実行結果
>>putc1 a b⏎ …… ファイル a を b にコピー

>>■
1文字ずつのファイルコピー(その2)
putc1.c と putc2.c は同じ動作をするプログラムで、ファイルを1文字ずつコピーします。ファイルの扱いの基本となるプログラムです。
// putc2.c

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


int main(int argc,char *argv[])
{
  int c; // EOF検出のためcharは不可
  FILE *sget=fopen(argv[1],"r"); // 入力
  FILE *sput=fopen(argv[2],"w"); // 出力

  while((c=getc(sget))!=EOF) // 文字入力
    putc(c,sput);  // ファイル文字出力

  return EXIT_SUCCESS;
} // main
実行結果
>>putc1 a b⏎ …… ファイル a を b にコピー

>>■





◆リンクは、ご自由にお張りください。

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