HIR-NET Home
運営者
オンラインソフト
運営者著書
CG
HIR-NETリンク集
C言語辞典
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 にコピー
>>■
HIR-NET Home
運営者
オンラインソフト
運営者著書
CG
HIR-NETリンク集
◆リンクは、ご自由にお張りください。
Copyright © 1988-2017 Hirabayashi Masahide プライバシーポリシー