☆標準関数、マクロ
ANSI-Cを基本にLinux, Cygwin等で一般的に使用可能なものを含む
◎アルファベット順 A-F
◆abort()
│ #include <stdlib.h>
│ void abort(void);
※プログラムを異常終了させる。
◆abs()
│ #include <stdlib.h>
│ int abs(int i);
※引数にとった整数の絶対値(0~UNIT_MAX)を返す。最小負数の絶対値は正の整数として表現できない処理系が多いので、その場合の返却地はINT_MINとなる。
◆acos()
│ #include <math.h>
│ double acos(double x);
※余弦値xの逆余弦の主値(0≦acos(x)≦+π)をラジアン値で返す。-1≦x≦+1に無いときは定義域エラー(処理系定義の値)を返す。errno=EDOMとなる。
arccos x = -i log(x±i√(1-x^2))
◆asctime()
│ #include <time.h>
│ char *asctime(const struct tm *tmptr);
※詳細時間 *tmptr を日付文字列に変換する。日付文字列は以下の形式である。
Www Mmm dd hh:mm:ss yyyy\n\000
◆asin()
│ #include <math.h>
│ double asin(double x);
※正弦値xの逆正弦の主値(-π/2≦asin(x)≦+π/2)をラジアン値で返す。-1≦x≦+1に無いときは定義域エラー(処理系定義の値)を返す。errno=EDOMとなる。
│ arcsin x = -i log(i * x±√(1-x^2))
◆assert()
│ #include <assert.h>
│ void assert (int test);
※特定条件時に異常終了させる。診断式 test が偽(0)である場合、診断式、file名、行番号を表示し、abort()を呼び出し実行を終了する。
※NDEBUGがマクロ定義されているとvoid式に変換され何もしない。
◆atan()
│ #include <math.h>
│ double atan(double x);
※正接値xの逆正接の主値(-π/2≦atan(x)≦+π/2)をラジアン値で返す。
│ arctan x = -(i/2) * log((1+i*x)/(1-i*x))
◆atan2()
│ #include <math.h>
│ double atan2(double y, double x);
※y/xの逆正接の主値(-π≦atan2(y,x)≦+π)をラジアン値で返す。実引数の符号を用いて返却値の象限を決定する。実引数が2つとも0のときは定義域エラーとなる。
◆atexit()
│ #include <stdlib.h>
│ int atexit(void (*func)(void));
※終了時に実行する関数funcの登録をする。登録が成功した場合0を返す。失敗した場合、非0を返す。
◆atof()
│ #include <stdlib.h>
│ double atof(const char *s);
※文字列 *s を浮動小数点数に変換する。認識される文字列の前に空白類文字があってもよい。
◆atoi()
│ #include <stdlib.h>
│ int atoi(const char *s);
※文字列 *s を整数に変換する。認識される文字列の前に空白類文字があってもよい。
※strに整数が含まれていなかったり、エラーが発生した場合には0が返る
⇒返り値でエラーを知ることはできない
※atoi(3)
◆atol()
│ #include <stdlib.h>
│ int atol(const char *s);
※文字列 *s を整数に変換する。認識される文字列の前に空白類文字があってもよい。
※strに整数が含まれていなかったり、エラーが発生した場合には0が返る
◆bsearch()
#include <stdlib.h> void *bsearch( const void *key, const void *base, size_t n, size_t size, int (*fnc)(const void *, const void *) );
※検索キーを *key に、検索する配列を *base に、要素の個数を n に、要素1個のサイズを size にセットし、比較関数 *fnc を与えてバイナリサーチを行い、配列の一致する要素へのポインタを返す。一致する要素が無いときは、NULL ポインタを返す。
※配列は比較関数に従う昇順の整列順序をもっていなかればならない。
※比較関数の返却値は、
│ 第1引数<第2引数 負の数
│ 第1引数=第2引数 0
│ 第1引数>第2引数 正の数
◆calloc()
│ #include <stdlib.h>
│ void *calloc(size_t n, size_t size);
※区画の大きさがsizeのn個のオブジェクトの配列の領域をヒープ領域に割り当てる。すべてのビットが0で初期化される。
※返却値は、割付られた領域へのポインタである。領域が割付できなかった場合はNULLを返す。
※calloc(3)
⇒確保したメモリはfree()で解放する
◆ceil()
│ #include <math.h>
│ double ceil(double x);
浮動小数xより小さくないもっとも小さい整数、ただしdouble形式を返す。
◆clearerr()
│ #include <stdio.h>
│ void clearerr(FILE *stream);
ストリーム *stream のファイル終了指示子(EOF)とファイルエラー指示子を初期化し、非終了状態と非エラー状態にする。返却値はない。
※clearerr()でエラーをクリアしたら、fseek()でファイル先頭などへ戻す。
※成長するファイルを追いかけながらアクセスする場合など、一端EOFに達しても、別プロセスが追加すれば先が読めることがある。
⇒通常のstdioは一度EOFになるとそれ以降は読みに行かなくなるので、clearerr()をつかってEOFをクリアし、再度読みにいく。
◆clock()
│ #include <time.h>
│ clock_t clock(void);
プロセッサ時間を返す。秒に直すには、返却値を CLOCKS_PER_SEC マクロで割る。無効な場合には、clock_tでキャストした-1を返す。
※プログラムの実行時間の決定には、2点でこの関数を呼び出し、差を求めるが、時間計測の精度が低い処理系でも精度以上の高分解能の返却値が得られることがある。
◆cos()
│ #include <math.h>
│ double cos(double x);
※radで与えられた角度に対する余弦値を返す。
◆cosh()
│ #include <math.h>
│ double cosh(double x);
※双曲線余弦値を返す。xの絶対値が大きすぎる場合は、範囲エラーとなる。
◆ctime()
│ #include <time.h>
│ char * ctime(const time_t *timer);
※暦時間 *timer を地域時間で表した文字列に変換する。
◆difftime()
│ #include <time.h>
│ double difftime(time_t t1, time_t t2);
※time_t型(構造体)の暦時間の差を double 型の秒単位で返す。
◆div()
│ #include <stdlib.h>
│ div_t div(int numer, int denom);
※整数の被除数と除数から、商と剰余を求める。返値は構造体div_t型のメンバ .quot, .rem である。
◆errno
最後のエラー番号を保持するマクロ。大域変数として扱える。
※エラーが起きたときのみ参照してよい。
⇒成功しても、以前のエラーを保持している場合がある。
※マニュアルで許可されている場合を除き
│ 先にerrnoに0をセット
│ errnoが0ならエラーなしと判断するのは不可
⇒成功してもerrnoにセットされる場合がある
◆exit()
│ #include <stdlib.h>
│ void exit(int status);
※プログラムを正常終了させる。リターンしない。
①atexit関数により登録された関数をLIFOで実行する。
②オープンしている全ての出力ストリームをフラッシュ。
③全てのストリームをクローズ。
④tmpfile関数による一時ファイルは削除。
⑤status値をもてホスト環境へ戻る。
※exit(3)
プロセスを終了する。
※終了ステータスは、慣習上、0で実行成功、0以外で失敗
⇒0~255の範囲
⇒直接数値を書くより、マクロ EXIT_SUCCESS と EXIT_FAILURE を使う方がよい。
※main()関数での exit(0);と return 0;は本質的に変わりがない。
⇒Cのプログラムはexit(main(argc, argv))が実行されたように起動されるため
※終了ステータスのシェルからの参照
tcsh, csh
⇒ $status
sh, bash
⇒ $?
◆exp()
│ #include <math.h>
│ double exp(double x);
※e^xを計算する。xの絶対値が大きすぎる場合は範囲エラーを起こす。
◆fabs()
│ #include <math.h>
│ double fabs(double x);
※絶対値を求める。
◆fclose()
│ #include <stdio.h>
│ int fclose(FILE *stream);
※fopen()で開いたストリームを閉じる
※フラッシュ後、ファイルをクローズし、ストリームを切り離す。
※正しくクローズされた場合は0、エラーが検出された場合はEOFを返す。
※原因はerrnoにセットされる
⇒EOFはstdio.hで定義されており、通常は-1
※fclose(3)
◆fdopen()
│ #include <stdio.h>
│ FILE *fdopen(int fd, const char *mode);
※ファイルディスクリプタfdをラップするFILE型の値を新しく作成してポインタを返す。失敗したらNULLを返す
◆feof()
│ #include <stdio.h>
│ int feof(FILE *stream);
※ファイル終了でなければ0、ファイル終了であれば非0を返す。
※文字入力関数は、ファイル位置指示子を進めてから文字を参照するので、feof()を呼ぶのはその直後が良い。
※使用しなくてもプログラムは書けるので、使わないこと
◆ferror()
│ #include <stdio.h>
│ int ferror(FILE *stream);
※ファイルエラーでなければ0、ファイルエラーであれば非0を返す。
※必要性低い
◆fflush()
│ #include <stdio.h>
│ int fflush(FILE *stream);
※バッファをフラッシュさせる。成功した場合は0を返す。エラーが検出された場合はEOFを返す。
※streamがバッファしている内容を即座にwrite()する。
⇒改行せずに文字列を端末に表示するときなどに使える
例)プロンプト
◆fgetc()
│ #include <stdio.h>
│ int fgetc(FILE *stream);
※バイト単位(バイト幅文字)入出力
※入力ストリームから次に入力される文字があれば入力し、ファイル位置指示子を進める。入力は0~UCHAR_MAXまでのunsigned charで読み、intに変換して返す。
※ファイルの末尾では、EOFを返す。
※エラー時にもEOFを返すが、ファイルエラー指示子をストリームに設定する。
※getc()、putc()は fgetc(), fputc()相当のマクロ
⇒GNU libcでは速度に差はない
◆fgetpos()
│ #include <stdio.h>
│ int fgetpos(FILE *stream, fpos_t *pos);
※ストリーム *stream のファイル位置指示子の値をファイル位置 *pos に格納し、成功した場合は0、不成功の場合は非0を返し、errnoに処理系定義の値を代入する。
◆fgets()
│ #include <stdio.h>
│ char *fgets(char *s, int n, FILE *stream);
※行単位入力
※ストリーム *stream から配列 *s にnバイト未満の文字を読み込む。
※文字の読み込みはファイルの終わりか、改行文字まで読み込まれる。(改行文字も読み込まれる。)
※文字列の直後には空文字(null)が付加される。
※成功時にはsを返すが、ファイルの終わりで読み込めなかった場合やエラー時にはNULLポインタを返す。
※*s=*buf, n=size
※ストリームから1行よみとってbufに格納するが、最大でもsize-1バイトしか読み込まない。末尾に\0を書き込むため
※正常に1行読み込むか、size-1バイトよめればbufを返すが、1文字も読めずにEOFに当たった場合はNULLを返す。
※問題
ちゃんと1行読んだのか、バッファが一杯になったのか、区別がつかない
※改行文字の扱い
│ gets 捨てる
│ fgets 読み込む
│ puts 付加して出力
│ fputs 付加しない
※fgets()では改行文字まで読みこむので、これをputs()に渡すと1個余分になってしまう
◆fileno()
#include <stdio.h>
int fileno(FILE *stream);
streamがラップしているファイルディスクリプタを返す。
◆floor()
│ #include <math.h>
│ double floor(double x);
※浮動小数点数xより大きくないもっとも大きい整数をdouble型で返す。数学のガウス記号[]にあたる。
◆fmod()
│ #include <math.h>
│ double fmod(double x, double y);
※x/yの剰余を求める。yが0の場合は0を返す。
◆fopen()
│ #include <stdio.h>
│ FILE *fopen(const char *filename,const char *mode);
※ファイルをオープンする。
*filename ファイル名文字列
*mode オープンモード文字列。
※ファイルにつながるストリームを作り、それを管理するFILE型へのポインタを返す
※ストリームを制御するオブジェクトへのポインタを返す。オープン操作に失敗したときはNULLポインタを返す。
※fopen(3)
※失敗するとNULLを返す。原因はerrno
※バイナリファイルを表す”b”も追加できるがLinuxではバイナリとテキストの区別はない。
_◇オープンモード文字列(””で囲う)
│ r テキストファイル、読み込み
│ w テキストファイル、書き込み
│ a テキストファイル、追加
│ rb バイナリファイル、読み込み
│ wb バイナリファイル、書き込み
│ ab バイナリファイル、追加
│ r+ テキストファイル、読み込み/更新、ファイルは存在しなければならない
│ w+ テキストファイル、書き出し/更新、ファイルは存在しなくても良い
│ a+ テキストファイル、追加/更新、ファイルが存在すれば末尾に追加
│ r+b,rb+ バイナリファイル、読み込み/更新
│ w+b,wb+ バイナリファイル、書き出し/更新
│ a+b,ab+ バイナリファイル、追加/更新
※Linuxではバイナリとテキストの区別は無いので指定しても無視される
◆fprintf()
│ #include <stdio.h>
│ int fprintf(FILE *stream,const char *format,…);
※書式つきファイル出力
│ *stream 出力ストリーム
│ *format 書式文字列
│ … 可変個引数
※転送されたバイト数を返す。出力エラーの場合は負の値を返す。
◆fputc()
│ #include <stdio.h>
│ int fputc(int c, FILE *stream);
※バイト単位(バイト幅文字)入出力
※fgetc()したバイトをそのままfputc()できるようにcはint型となっている
※文字のファイル出力。
│ c 出力文字
│ *stream 出力ストリーム
※cはunsigned charに変換した上で書き込まれる。通常は書かれた文字cを返却する
※エラー時にはEOFを返す。
⇒バイナリモードの場合は判別できないので、ferror()で識別する。
※getc()、putc()は fgetc(), fputc()相当のマクロ
⇒GNU libcでは速度に差はない
◆fputs()
│ #include <stdio.h>
│ int fputs(const char *s, FILE *stream);
※
※文字列のファイル出力。文字列末尾の空文字は書き込まれない。
※成功した場合は、非負の値を返すが、失敗した場合はEOFを返す。
⇒ストリームに全てのバイト列を書き終えた場合も、何か問題がおきた場合もEOFを返す。
※errnoを見ないとエラーなのか終了なのか判断できない
⇒あらかじめerrnoを0クリアしておく
※行末に\nを出力してくれるわけではない。
errno=0; if (fputs(buf, f) == EOF) { if (errno != 0) { //エラー処理 } }
※fputs(3)
◆fread()
│ #include <stdio.h>
│ size_t fread(void *ptr,size_t size,size_t n,
│ FILE *stream);
※stdio経由の固定バイト長の入力。システムコールのreadに相当。他のstdioを使うライブラリと併用可。
※ファイルからの要素よみこみ
│ *ptr 読み込み先の配列
│ size 各要素の大きさ
│ n 要素の個数
│ *stream 読み込み元ストリーム
※読み込み後、読み込み成功文字数分だけファイル位置子は進められるが、エラーが発生した場合は不定。読み込みに成功した要素の個数を返す。
例)
if (fread(buf, sizeof(char), n, fp) != n) { clean_up(“Error.”);
注意)データの内部表現のコピーをファイルに出力するので、アーキテクチャに依存する。
◆free()
│ #include <stdlib.h>
│ void free(void *ptr);
※ヒープ領域に割り当てたメモリを解放する
※領域 *ptr を開放する。
※即座にexit()するならfree()しなくても実害ナイはず。多分。ホントか?
※free(3)
◆freopen()
│ #include <stdio.h>
│ FILE *freopen(const char *filename,
│ const char *mode,
│ FILE *stream);
※既存のストリームと結合しているファイルを変更する。一旦クローズした後、オープンモードで開きなおす。クローズの失敗は無視され、ファイルエラー指示子とファイル終了指示子は初期化される。標準テキストストリーム stdin, stdout, stderr に対応するファイルを変更することができる。
│ 例)
│ freopen(“freopen.txt”,”w”,stdout);
◆frexp()
│ #include <math.h>
│ double frexp(double x, int *n);
※浮動小数点値 x を正規化分数 (normalized fraction) y (yy=x/2^n)と2の整数累乗 n に分割し、yを返す。
*n 整数指数の格納先
◆fscanf()
│ #include <stdio.h>
│ int fsanf(FILE *stream,const char *format,…);
※書式つきファイル入力
│ *stream 入力ストリーム
│ *format 書式文字列
│ … 可変個引数
※代入された入力項目数を返す。入力失敗が発生した場合はEOFを返す。
◆fseek()
│ #include <stdio.h>
│ int fseek(FILE *stream,long int offset,int origin);
※ストリーム *stream のファイル位置指示子を設定し、ファイル内を移動する。originには以下のマクロを指定。
│ SEEK_SET ファイルの先頭
│ SEEK_CUR ファイルの現在位置
│ SEEK_END ファイルの終端
ただし、バイナリストリームに対するSEEK_ENDは不定。
※バイナリストリーム
│ 移動原点からoffsetバイト分移動する。
※テキストストリーム
│ オフセットに0を指定するか、ftell関数の以前の返却値を指定する。(テキストの場合、必ずしも読み書きした文字のバイト数とoffsetの差が一致しないため。)
※成功した場合は0を、失敗した場合は非0を返す。
※第2引数がlongのため、ファイルサイズが2GBに制限される
◆fseeko()
│ #include <stdio.h>
│ int fseeko(FILE *stream, off_t offset, int whence)
fseek()と同等だが、第2引数がoff_t型となっている。
⇒デフォルトではoff_t型はlong
#define _FILE_OFFSET_BITS 64
でビルドすると、off_t型は64ビット符号付整数(long long)となり2GBを越えるファイルを扱えるようになる
◆fsetpos()
│ #include <stdio.h>
│ int fsetpos(FILE *stream,const fpos_t *pos);
※ストリーム *stream に対して fgetpos() で事前に得た *pos 値を設定し、ファイル内の位置をその位置に戻す。成功した場合は0、不成功の場合は非0を返し、errnoに処理系定義の値を代入する。
◆ftell()
│ #include <stdio.h>
│ long int ftell(FILE *stream);
※ストリームのファイル位置指示子の値を調べる。バイナリストリームに対してはファイルの先頭からのバイト数を与えるが、テキストストリームに対しては fseek の offset として使えるだけで、文字数そのものとは一致しない。
◆ftello()
#include <stdio.h>
off_t ftello(FILE *stream);
ftell()のoff_t版、詳しくはfseeko()参照
◆fwrite()
│ #include <stdio.h>
│ size_t fwrite(const void *ptr,
│ size_t size, size_t n, FILE *stream);
stdio経由の固定バイト長の出力。システムコールのwriteに相当する。他のstdioを使うライブラリと併用できる。
※ファイルへの要素の書き込み
│ *ptr 書き込む配列の格納元
│ size 各要素の大きさ
│ n 要素の個数
│ *stream 書き込み先ストリーム
※書き込み後、書き込み成功文字数分だけファイル位置子は進められるが、エラーが発生した場合は不定。書き込みに成功した要素の個数を返す。
例)
if(fwrite(buf, sizeof(char), n, fp) != n) { message(“Error.”, 0);
注意)データの内部表現のコピーをファイルに出力するので、アーキテクチャに依存する。