C言語編 標準ライブラリのリファレンス「F」

「F」で始まる標準ライブラリ関数及び、その他の定義です。

fabs関数

概要 絶対値を返す。
ヘッダ math.h
形式 double fabs(double x);
引数 x 絶対値を求める対象の値。
戻り値 引数x の絶対値。
詳細
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", fabs(7.2) );
	printf( "%f\n", fabs(-7.2) );
	printf( "%f\n", fabs(0.0) );

	return 0;
}

実行結果:

7.200000
7.200000
0.000000
関連 float型バージョンのfabsf関数と、long double型バージョンのfabsl関数がある。
また、整数型を扱う abs関数labs関数llabs関数があるが、 これらは stdlib.h に定義されている。
なお、絶対値を求めるこれらの関数のうち、fabsf関数、fabsl関数、llabs関数は C99 から追加されたものである。
また、C99 で追加された intmax_t型の値に対して絶対値を求める imaxabs関数がある。
解説章

fabsf関数

概要 絶対値を返す。
ヘッダ math.h
形式 float fabsf(float x);
引数 x 絶対値を求める対象の値。
戻り値 引数x の絶対値。
詳細
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", fabsf(7.2f) );
	printf( "%f\n", fabsf(-7.2f) );
	printf( "%f\n", fabsf(0.0f) );

	return 0;
}

実行結果:

7.200000
7.200000
0.000000
関連 double型バージョンのfabs関数と、long double型バージョンのfabsl関数がある。
また、整数型を扱う abs関数labs関数llabs関数があるが、 これらは stdlib.h に定義されている。
なお、絶対値を求めるこれらの関数のうち、fabsf関数、fabsl関数、llabs関数は C99 から追加されたものである。
また、C99 で追加された intmax_t型の値に対して絶対値を求める imaxabs関数がある。
解説章

fabsl関数

概要 絶対値を返す。
ヘッダ math.h
形式 long double fabsl(long double x);
引数 x 絶対値を求める対象の値。
戻り値 引数x の絶対値。
詳細
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%Lf\n", fabsl(7.2L) );
	printf( "%Lf\n", fabsl(-7.2L) );
	printf( "%Lf\n", fabsl(0.0L) );

	return 0;
}

実行結果:

7.200000
7.200000
0.000000
関連 float型バージョンのfabsf関数と、double型バージョンのfabs関数がある。
また、整数型を扱う abs関数labs関数llabs関数があるが、 これらは stdlib.h に定義されている。
なお、絶対値を求めるこれらの関数のうち、fabsf関数、fabsl関数、llabs関数は C99 から追加されたものである。
また、C99 で追加された intmax_t型の値に対して絶対値を求める imaxabs関数がある。
解説章

false

概要 論理値の「偽」を表す値。
ヘッダ stdbool.h
形式 #define false 0
置換結果 0
詳細 C99 で追加された論理型 _Bool には、真や偽を表す特別な名前が用意されていない。 _Bool に対応する boolマクロが提供されているが、これに合わせて false も定義されている。 false という名前は、C++ において「偽」を表す標準のキーワードであり、それに合わせるように定義されている。
なお、このマクロを #undef で無効化したり、再び #define で定義し直したりすることが許可されている。
注意
使用例
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
	bool a = false;

	if( !a ){
		puts("OK");
	}
	
	return 0;
}

実行結果:

OK
関連 「真」であることを表す trueマクロがある。
解説章

fclose関数

概要 ファイルをクローズする。
ヘッダ stdio.h
形式 int fclose(FILE* stream);
引数 stream クローズするストリーム。
戻り値 成功したら 0 を、失敗したら EOF を返す。
詳細 指定されたストリームのフラッシュを行った後、クローズ処理を行う。
入力ストリームであれば、バッファ内のデータは無視され、出力ストリームであれば、書き出される。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fputs( "Hello, World\n", fp );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.txt)

Hello, World

関連 ファイルオープンは fopen関数で行う。
解説章 第39章

feof関数

概要 ファイルの終了を確認する。
ヘッダ stdio.h
形式 int feof(FILE* stream);
引数 stream 対象のストリーム。
戻り値 ファイルのカレントポジションが、終端まで来ているとき 0以外を返す。 そうでなければ 0 を返す。
詳細 FILE型のオブジェクトに含まれているファイル終了指示子を参照した結果を返している。 しかしながら、この値を直接調べるのは不適切であり、必ずこの関数を呼び出すべきである。
指定したストリームが標準入力の場合の挙動は、環境依存となる。
注意 fgetc関数などの入力関数は、ファイルのカレントポジションを進めてから、入力を行う。 この関数は、これらの入力関数を呼び出した直後に呼ぶと良い。
このような順序で行われるため、ファイルの最後の文字が入力された時点ではまだ feof関数は 0 を返す。 その後、もう1度入力関数が呼ばれて初めて、0以外を返すようになる。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int c;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	while( 1 ){
		c = fgetc( fp );
		if( c == EOF ){
			if( feof(fp) ){
				break;
			}
			else if( ferror(fp) ){
				fputs( "読み込み中にエラーが発生しました。\n", stderr );
				exit( EXIT_FAILURE );
			}
		}
		putchar( c );
	}

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

Hello, World

実行結果

Hello, World
関連 EOFマクロとは直接的には関係ない。 EOFマクロは、関係する標準関数の戻り値として使われているだけであり、本当に終端の確認を行うには、この関数に依ることになる。
なお、エラーの確認のために ferror関数がある。
解説章 第41章

ferror関数

FILE型のオブジェクトに含まれているファイルエラー指示子を参照した結果を返している。 しかしながら、この値を直接調べるのは不適切であり、必ずこの関数を呼び出すべきである。
fopen関数でファイルオープンを行った後のファイル操作に関しては、エラーの確認をこの関数で行う。 fopen関数のエラーは、fopen関数自体の戻り値で調べれば良い。 その他の関数に関しては、それぞれの戻り値が、エラーの可能性を持った値( EOFマクロなど)を返した直後に、 この関数を呼び出すことによって、エラーの有無を調べる。
ファイルエラー指示子は、clearerr関数によってクリアできる。 同一ストリームに対するferror関数は、クリアを行わない限り(あるいはストリームをクローズしない限り)、 1度 0以外を返すようになると、その後も 0以外を返し続ける。
概要 ファイル処理のエラーの有無を確認する。
ヘッダ stdio.h
形式 int ferror(FILE* stream);
引数 stream 対象のストリーム。
戻り値 ファイルのエラー値が設定されているとき 0以外を返す。 そうでなければ 0 を返す。
詳細
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int c;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	while( 1 ){
		c = fgetc( fp );
		if( c == EOF ){
			if( feof(fp) ){
				break;
			}
			else if( ferror(fp) ){
				fputs( "読み込み中にエラーが発生しました。\n", stderr );
				exit( EXIT_FAILURE );
			}
		}
		putchar( c );
	}

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

Hello, World

実行結果

Hello, World
関連 clearerr関数で、ファイルエラー指示子のクリアができる。
解説章 第41章

fflush関数

概要 バッファをフラッシュする。
ヘッダ stdio.h
形式 int fflush(FILE* stream);
引数 stream 対象のストリーム。
NULL を指定すると、現在オープンされているストリームのうち、フラッシュ操作の対象として適切である全てのストリームがフラッシュされる。
戻り値 成功したら 0、失敗したら EOF を返す。
詳細 対象のストリームが、バッファリングされている場合、バッファ内に残されているデータを吐き出す(フラッシュする)。
注意 入力ストリームを対象とする場合の動作は未定義である。
使用例
#include <stdio.h>

int main(void)
{
	char buf[80];
	char stdoutBuf[BUFSIZ];


	/* ラインバッファリングに変更 */
	setvbuf( stdout, stdoutBuf, _IOLBF, sizeof(stdoutBuf) );

	printf( "文字列を入力して下さい" ); /* 改行なし */
	fflush( stdout );
	fgets( buf, sizeof(buf), stdin );
	printf( "入力内容:%s\n", buf );

	return 0;
}

実行結果

文字列を入力して下さいHello
入力内容:Hello
関連 バッファリングの設定は、setbuf関数setvbuf関数で行える。
解説章 第43章

fgetc関数

概要 ファイルから文字の入力を受け取る。
ヘッダ stdio.h
形式 int fgetc(FILE* stream);
引数 stream 入力ストリーム。
戻り値 成功時は入力された文字が返される。失敗時や、ファイルの終端に達した際には EOF が返される。
詳細 引数を stdin にすることで、標準入力から受け取ることも可能である。
ファイルの終端に達したのか、エラーが発生したのかは、feof関数ferror関数で判断しなければならない。
注意 入力される文字は unsigned char型の範囲であるが、これを int型にキャストした状態で返される。
使用例
#include <stdio.h>

int main(void)
{
	int c;

	puts( "何か入力して下さい。" );
	c = fgetc( stdin );
	printf( "%c\n", c );

	return 0;
}

実行結果:

何か入力して下さい。
abc
a
関連 1文字の出力には fputc関数が使える。
C95以降は、ワイド文字バージョンの fgetwc関数が存在する。
解説章 第41章

fgetpos関数

概要 ファイルポジションを取得する。
ヘッダ stdio.h
形式 int fgetpos(FILE* stream, fpos_t* pos);
引数 stream 対象のストリーム。
pos ファイルポジションを受け取るアドレス。
戻り値 成功したら 0、失敗したら 0以外を返す。
詳細 現在のファイルポジションを表す値を取得する。 この結果は、fsetpos関数が使用できるような値になっている。
失敗した場合、errno に処理系定義の正の値が格納される。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

void printLine(FILE* fp);

int main(void)
{
	FILE* fp;
	fpos_t pos;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	printLine( fp );
	fgetpos( fp, &pos );
	printLine( fp );
	printLine( fp );
	fsetpos( fp, &pos );
	printLine( fp );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

void printLine(FILE* fp)
{
	char buf[80];

	fgets( buf, sizeof(buf), fp );
	printf( buf );
}

入力ファイル(test.txt)

aaaaa
bbbbb
ccccc
ddddd

実行結果:

aaaaa
bbbbb
ccccc
bbbbb
関連 この関数で取得できた値は、fsetpos関数に渡すことができる。
解説章 第40章

fgets関数

概要 ファイルから文字列の入力を受け取る。
ヘッダ stdio.h
形式 char* fgets(char* s, int n, FILE* stream);
引数 s 入力文字列を受け取る配列のアドレス。
n 引数s が指す配列の要素数。
stream 入力ストリーム。
戻り値 成功時は引数s と同じアドレスが返される。失敗時は NULL が返される。
詳細 第3引数を stdin にすることで、標準入力から受け取ることも可能である。
注意 gets関数とは異なり、改行文字も受け取る。 しかし、gets関数は使うべきではない。
使用例
#include <stdio.h>

int main(void)
{
	char str[80];

	puts( "何か入力して下さい。" );
	fgets( str, sizeof(str), stdin );
	puts( str );

	return 0;
}

実行結果:

何か入力して下さい。
abcde
abcde
関連 C95以降は、ワイド文字バージョンの fgetws関数が存在する。
解説章 第6章

fgetwc関数

概要 ファイルからワイド文字の入力を受け取る。
ヘッダ stdio.h あるいは wchar.h (いずれも C95以降)
形式 wint_t fgetwc(FILE* stream);
引数 stream 入力ストリーム。
戻り値 成功時は入力されたワイド文字が返される。 失敗時や、ファイルの終端に達した際には WEOF が返される。
詳細 引数を stdin にすることで、標準入力から受け取ることも可能である。
ファイルの終端に達したのか、エラーが発生したのかは、feof関数ferror関数で判断しなければならない。
注意
使用例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
	wint_t c;

	setlocale( LC_CTYPE, "" );

	puts( "何か入力して下さい。" );
	c = fgetwc( stdin );
	wprintf( L"%lc\n", c );

	return 0;
}

実行結果:

何か入力して下さい。
あいうえお
あ
関連 この関数は、fgetc関数ワイド文字版である。
1文字の出力には fputwc関数が使える。
解説章

fgetws関数

概要 ファイルからワイド文字列の入力を受け取る。
ヘッダ stdio.h あるいは wchar.h (いずれも C95以降)
形式 wchar_t* fgetws(wchar_t* s, int n, FILE* stream);
引数 s 入力文字列を受け取る配列のアドレス。
n 引数s が指す配列の要素数。
stream 入力ストリーム。
戻り値 成功時は引数s と同じアドレスが返される。失敗時は NULL が返される。
詳細 第3引数を stdin にすることで、標準入力から受け取ることも可能である。
なお、この関数は、char型バージョンである fgets関数と同様、改行文字も受け取る。
注意
使用例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
	wchar_t str[80];

	setlocale( LC_CTYPE, "" );

	puts( "何か入力して下さい。" );
	fgetws( str, sizeof(str), stdin );
	wprintf( L"%ls\n", str );

	return 0;
}

実行結果:

何か入力して下さい。
あいうえお
あいうえお
関連 この関数は、fgets関数ワイド文字版である。
解説章

FILE

概要 ストリーム制御情報の型。
ヘッダ stdio.h
形式 typedef struct {...} FILE;
詳細 ストリームを制御するために必要な情報。 構造体であるとは限らないし、構造体であったとしても、どのようなメンバを持っているかは分からない。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp = fopen( "hello.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fputs( "Hello, World\n", fp );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(hello.txt)

Hello, World
関連
解説章 第39章

FILENAME_MAX

概要 ファイル名の長さの上限を表す。
ヘッダ stdio.h
形式 #define FILENAME_MAX 260
置換結果 ファイル名の長さの上限。環境によって大きく異なる可能性がある。
詳細 現環境において、オープンできるファイルの名前の最大長。 文字列の末尾に付くヌル文字('\0') の分も含めた値に置換される。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
	char path[FILENAME_MAX];

	if( argc < 2 ){
		fputs( "コマンドライン引数が不足しています。\n", stderr );
		exit( EXIT_FAILURE );
	}

	strcpy( path, argv[1] );
	puts( path );

	return 0;
}
関連
解説章 第39章

floor関数

概要 小数点以下を切り捨てる。
ヘッダ math.h
形式 double floor(double x);
引数 x 対象の浮動小数点数。
戻り値 引数x 以下で、かつ、最も大きい整数。
詳細 返す結果は整数であるが、その型は double型である。 なお、floor は 床 という意味。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", floor(3.25) );
	printf( "%f\n", floor(-3.25) );
	printf( "%f\n", floor(0.0) );

	return 0;
}

実行結果:

3.000000
-4.000000
0.000000
関連 反対に、小数点以下を切り上げる関数は ceil関数である。
C99 には、float型バージョンの floorf関数と、long double型バージョンの floorl関数がある。
解説章 第21章

floorf関数

概要 小数点以下を切り捨てる。
ヘッダ math.h
形式 float floorf(float x);
引数 x 対象の浮動小数点数。
戻り値 引数x 以下で、かつ、最も大きい整数。
詳細 返す結果は整数であるが、その型は float型である。 なお、floor は 床 という意味。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", floorf(3.25f) );
	printf( "%f\n", floorf(-3.25f) );
	printf( "%f\n", floorf(0.0f) );

	return 0;
}

実行結果:

3.000000
-4.000000
0.000000
関連 double型を対象にした floor関数と、long double型を対象にした floorl関数がある。
なお、反対に、小数点以下を切り上げる関数はceilf関数である。
解説章 第21章

floorl関数

概要 小数点以下を切り捨てる。
ヘッダ math.h
形式 long double floorl(long double x);
引数 x 対象の浮動小数点数。
戻り値 引数x 以下で、かつ、最も大きい整数。
詳細 返す結果は整数であるが、その型は long double型である。 なお、floor は 床 という意味。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%Lf\n", floorl(3.25L) );
	printf( "%Lf\n", floorl(-3.25L) );
	printf( "%Lf\n", floorl(0.0L) );

	return 0;
}

実行結果:

3.000000
-4.000000
0.000000
関連 float型を対象にした floorf関数と、double型を対象にした floor関数がある。
なお、反対に、小数点以下を切り上げる関数はceill関数である。
解説章 第21章

FLT_MAX

概要 float型で表現可能な最大の数。
ヘッダ float.h
形式 #define FLT_MAX 3.402823466e+38f
置換結果 float型で表現可能な最大の数。
詳細
注意 float型で表現できる一番小さい値は、-FLT_MAX である。 FLT_MIN は、一番小さい正数を表している。
使用例
#include <stdio.h>
#include <float.h>

int main(void)
{
	printf( "%e\n", FLT_MAX );

	return 0;
}

実行結果:

3.402823e+038
関連 FLT_MIN は、float型で表現できる一番小さい正数を表す。
解説章 第20章

FLT_MIN

概要 float型で表現可能な最小な正数。
ヘッダ float.h
形式 #define FLT_MIN 1.175494351e-38f
置換結果 float型で表現可能な最小な正数。
詳細 float型で表現することができる最も小さい正の数を表している。 言い換えると、最も 0 に近い正数である。
注意 この記号定数は、負数にはならないので、float型の最小値を表してはいない。 最小値が必要ならば、-FLT_MAX を使う。
使用例
#include <stdio.h>
#include <float.h>

int main(void)
{
	printf( "%e\n", FLT_MIN );

	return 0;
}

実行結果:

1.175494e-038
関連 float型の最大値は FLT_MAX を調べる。
解説章 第20章

fopen関数

概要 ファイルを開く。
ヘッダ stdio.h
形式 FILE* fopen(const char* filename, const char* mode);
引数 filename ファイル名。
mode モード。
戻り値 成功した場合は、開いたファイルを操作するためのポインタを返す。 失敗した場合は、NULL を返す。
詳細 引数filename に与えるファイル名は、環境に応じたファイルパスの表現を受け付ける。 例えば、Windows では "documents\\test.txt" により documentsフォルダ内の test.txt を開くことができる。 また、受け付けられることが保証された最大長は、FILENAME_MAXマクロで与えられている。
引数mode には、以下の指定を与えられる。
モード 意味
r テキストファイルを読み込み用に開く
w テキストファイルを書き込み用に開く
a テキストファイルを追記用に開く
rb バイナリファイルを読み込み用に開く
wb バイナリファイルを書き込み用に開く
ab バイナリファイルを追記用に開く
r+ テキストファイルを読み書き両用に開く
w+ テキストファイルを読み書き両用に開く
a+ テキストファイルを読み書き両用で追加あるいは作成する
rb+ または r+b バイナリファイルを読み書き両用に開く
wb+ または w+b バイナリファイルを読み書き両用に開く
ab+ または a+b バイナリファイルを読み書き両用で追加あるいは作成する
コンパイラによっては、これらのモード名の後ろに何らかの文字列を続ける形で、 独自のモードを提供していることがある。
注意 同時に開くことができるファイルの最大数は、FOPEN_MAXマクロで与えられている。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp = fopen( "hello.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fputs( "Hello, World\n", fp );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(hello.txt)

Hello, World
関連 ファイルを閉じるには fclose関数を用いる。
解説章 第39章

FOPEN_MAX

概要 同時にオープンできるファイルの最大数を表す。
ヘッダ stdio.h
形式 #define FOPEN_MAX 20
置換結果 同時にオープンされた状態にできるファイル数の上限。環境によって大きく異なる可能性がある。
詳細 同時にオープンされた状態にできるファイル数の上限を表す。
この数値には、標準入力、標準出力、標準エラーのストリームの分も含まれている。 また、最低でも 8以上であることが保証されている。
注意 置換結果が表す数値は、現在の環境における上限値である。 そのため、同時に実行されている他のアプリケーションが、既に幾らかのファイルを使用している場合、 この置換結果通りの個数のファイルが使えない可能性がある。
使用例
#include <stdio.h>

int main()
{
	FILE* fp[FOPEN_MAX];

	/* 省略 */

	return 0;
}
関連
解説章

fprintf関数

概要 任意のストリームへ、フォーマット指定された文字列を出力する。
ヘッダ stdio.h
形式 int fprintf(FILE* stream, const char* format, ...);
引数 stream 出力先のストリーム。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 結果を任意のストリームへ出力することを除き、printf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、fprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	fprintf( fp, "%d %3d %03d", 10, 10, 10 );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果 (test.txt)

10  10 010
関連 標準出力へ同様のフォーマット指定を行い出力するには、printf関数を使う。 変換結果を文字配列に格納するには sprintf関数が使える。
引数... の代わりに、va_list を用いたバージョンとして、vfprintf関数がある。
C95規格からは、ワイド文字に対応した fwprintf関数が追加されている。
解説章 第41章

fputc関数

概要 出力ストリームへ1文字出力する。
ヘッダ stdio.h
形式 int fputc(int c, FILE* stream);
引数 c 出力する文字。
stream 出力ストリーム。
戻り値 成功すれば、c がそのまま返される。失敗時は EOF が返される。
詳細 同じことを行う putc関数がある。 putc関数は、マクロとして実装されていることがあり、そちらの方が効率が良いかも知れない。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	
	fputc( 'a', fp );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.txt)

関連 putc関数は、同じ効果の標準関数だが、マクロとして実装されていることがある。
文字列の出力には、fputs関数が使える。
C95以降は、ワイド文字版の fputwc関数が存在する。
解説章 第41章

fputs関数

概要 任意のストリームへ文字列を出力する。
ヘッダ stdio.h
形式 int fputs(const char* s, FILE* stream);
引数 c 出力する文字列。
stream 出力先のストリーム。
戻り値 エラー発生時には EOF を返し、正常終了時には負数でない値を返す。
詳細
注意 puts関数と違い、改行文字は付加されない。
使用例
#include <stdio.h>

int main(void)
{
	fputs( "Hello, World\n", stdout );

	return 0;
}

実行結果:

Hello, World
関連 似た関数として、標準出力用の puts関数がある。
C95 で、ワイド文字版の fputws関数が追加された。
解説章 第40章

fputwc関数

概要 出力ストリームへ1文字出力する。
ヘッダ stdio.h、wchar.h
形式 wint_t fputwc(wchar_t c, FILE* stream);
引数 c 出力する文字。
stream 出力ストリーム。
戻り値 成功すれば、c がそのまま返される。失敗時は WEOF が返される。
詳細 同じことを行う putwc関数がある。 putwc関数は、マクロとして実装されていることがあり、そちらの方が効率が良いかも知れない。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
	FILE* fp;

	setlocale( LC_CTYPE, "" );

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	
	fputwc( L'あ', fp );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.txt)

関連 マルチバイト文字版は、fputc関数である。
putwc関数は、同じ効果の標準関数だが、マクロとして実装されていることがある。
文字列の出力には、fputws関数が使える。
解説章

fputws関数

概要 任意のストリームへワイド文字列を出力する。
ヘッダ stdio.h、wchar.h
形式 int fputws(const wchar_t* s, FILE* stream);
引数 c 出力する文字列。
stream 出力先のストリーム。
戻り値 エラー発生時には WEOF を返し、正常終了時には負数でない値を返す。
詳細 C99 以降では、コードエラーの発生時に、 errnoEILSEQ が設定されるかも知れない。
注意 改行文字は付加されない。
使用例
#include <stdio.h>
#include <locale.h>

int main(void)
{
	setlocale( LC_CTYPE, "" );

	fputws( L"こんにちは\n", stdout );

	return 0;
}

実行結果:

こんにちは
関連 マルチバイト文字版の fputs関数がある。
解説章

fread関数

概要 入力ストリームから、バイナリデータを読み取る。
ヘッダ stdio.h
形式 size_t fread(void* ptr, size_t size, size_t n, FILE* stream);
引数 ptr 読み取ったデータを受け取る配列のアドレス。 引数n が 1 であれば、単独の変数のアドレスでも構わない。
size 要素1個のサイズ。
n 要素数。
stream 入力ストリーム。
戻り値 実際に読み込まれた要素数。
エラーが発生したり、ファイルの末尾まで到達したりした際には、引数n よりも小さい値が返される。 どちらが理由かは、ferror関数feof関数で判断できる。
詳細
注意 引数size や n に 0 を指定した場合には、何も起こらず、0 が返される。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int num;
	double d;
	char str[7];


	fp = fopen( "test.bin", "rb" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}


	fread( &num, sizeof(num), 1, fp );
	fread( &d, sizeof(d), 1, fp );
	fread( str, sizeof(char), sizeof(str), fp );


	printf( "%d\n", num );
	printf( "%f\n", d );
	printf( "%s\n", str );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)

900
7.850000
xyzxyz
関連 バイナリデータの書き込みには fwrite関数を用いる。
解説章 第42章

free関数

概要 動的に割り当てられたメモリ領域を解放する
ヘッダ stdlib.h
形式 void free(void* ptr);
引数 ptr 解放する領域のアドレス。 malloc関数calloc関数realloc関数 のいずれかで確保された領域のアドレスでなければならない。
戻り値 なし
詳細 malloc関数calloc関数realloc関数のいずれかの関数で 動的に割り当てられたメモリ領域を解放する。
ヌルポインタを指定した場合には、何も起こらないことが保証されている。
注意 malloc関数calloc関数realloc関数のいずれかの関数で 確保されていない領域のアドレスを渡す行為は未定義である。
また、既に解放済みの領域を再度指定することも未定義であり、避けなければならない。
解放処理の後、その領域がどんな状態になるのかは環境依存である。
使用例
#include <stdio.h>
#include <stdlib.h>

#define ALLOCATE_SIZE	(10)

int main(void)
{
	int* values;
	int i;
	
	values = malloc( sizeof(int) * ALLOCATE_SIZE );
	if( values == NULL ){
		exit( EXIT_FAILURE );
	}

	for( i = 0; i < ALLOCATE_SIZE; ++i ){
		values[i] = i;
	}

	for( i = 0; i < ALLOCATE_SIZE; ++i ){
		printf( "%d\n", values[i] );
	}

	free( values );

	return 0;
}

実行結果:

0
1
2
3
4
5
6
7
8
9
関連
解説章 第34章

freopen関数

概要 ストリームを開きなおす
ヘッダ stdio.h
形式 FILE* freopen(const char* filename, const char* mode, FILE* stream);
引数 filename ファイル名。
mode モード。
stream 既に開かれているストリーム。
戻り値 成功した場合は、新たに開きなおされたストリームを操作するポインタ。 失敗した場合は NULL
詳細 まず、引数stream が指すストリームを閉じる処理を行う。 ここで発生したエラーについては無視される。
続いて、引数filename、mode の値を使って fopen関数を呼び出したときと同様の処理によって、ストリームを開きなおす。 引数stream が指す FILE構造体のメンバが変更される。
stdinstdoutstderr をファイルに結びつける用途で使用することができる。
注意 どのような状況下で成功・失敗するかについての詳細は、処理系定義となっている。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* stream = freopen( "test.txt", "w", stdout );
	if( stream == NULL ){
		fputs( "freopen が失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fputs( "test message\n", stream );

	if( fclose( stream ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力):


実行結果(test.txt):

test message
関連
解説章

fscanf関数

概要 任意のストリームから、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int fscanf(FILE* stream, const char* format, ...);
引数 stream 対象のストリーム。
format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 結果を任意のストリームから受け取ることを除き、scanf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、fscanf関数としては無視する。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int num;
	char str[10];
	double f;

	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	fscanf( fp, "%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル (test.txt):

100 abc 2.500000

実行結果

100 abc 2.500000
関連 任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、fscanf関数を使う。 対象が文字列の場合は、sscanf関数が使える。
引数... の代わりに、va_list を用いたバージョンとして、vscanf関数がある。
C95規格からは、ワイド文字に対応した wscanf関数が追加されている。
解説章 第41章

fseek関数

概要 ファイルポジションを変更する。
ヘッダ stdio.h
形式 int fseek(FILE* stream, long int offset, int origin);
引数 stream 対象のストリーム。
offset 移動量。
origin 移動の原点を表す値。以下のいずれかを指定する。
SEEK_SET はファイルの先頭、 SEEK_CUR は現在の位置、 SEEK_END はファイルの終端を表す。 ただし、規格上保証された第2引数との組み合わせのパターンは少ないので注意すること(「注意」の項を参照)
戻り値 成功したら 0、失敗したら 0以外を返す。
詳細 ファイルポジションを移動する。
この関数が成功した場合、対象のストリームは終了状態で無くなる。つまり、feof関数が偽を返すような状態に戻される。 また、ungetc関数によって押し戻されていた文字はクリアされる。
注意 対象がバイナリストリームの場合、第3引数に SEEK_END を指定した際の挙動は不定である。
対象がテキストストリームの場合、第3引数を SEEK_CUR、SEEK_END を指定した場合には、第2引数は 0以外保証されない。 SEEK_SET を指定した場合には、第2引数には ftell関数で受け取った値を指定する。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}


	printf( "%c\n", fgetc( fp ) );
	printf( "%c\n", fgetc( fp ) );
	printf( "%c\n", fgetc( fp ) );
	fseek( fp, 0, SEEK_SET );
	printf( "%c\n", fgetc( fp ) );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

abcde

実行結果:

a
b
c
a
関連 現在のファイルポジションを ftell関数で取得できる。 また、移動量が大きすぎて long int型で表現できない場合、fsetpos関数が利用できる。
解説章 第40章第42章

fsetpos関数

概要 ファイルポジションを設定する。
ヘッダ stdio.h
形式 int fsetpos(FILE* stream, const fpos_t* pos);
引数 stream 対象のストリーム。
pos fgetpos関数で取得したファイルポジションの値。
戻り値 成功したら 0、失敗したら 0以外を返す。
詳細 成功した場合、ファイル終了指示子を初期化する。これは feof関数が真を返す状況を表すフラグである。 また、ungetc関数によってバッファへ押し戻された文字もクリアされる。
失敗した場合、errno に処理系定義の正の値が格納される。
注意 引数pos に渡す値は、同じストリームに対する fgetpos関数によって取得したものでなければならない。
使用例
#include <stdio.h>
#include <stdlib.h>

void printLine(FILE* fp);

int main(void)
{
	FILE* fp;
	fpos_t pos;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	printLine( fp );
	fgetpos( fp, &pos );
	printLine( fp );
	printLine( fp );
	fsetpos( fp, &pos );
	printLine( fp );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

void printLine(FILE* fp)
{
	char buf[80];

	fgets( buf, sizeof(buf), fp );
	printf( buf );
}

入力ファイル(test.txt)

aaaaa
bbbbb
ccccc
ddddd

実行結果:

aaaaa
bbbbb
ccccc
bbbbb
関連 この関数で取得できた値は、fsetpos関数に渡すことができる。
解説章 第40章

ftell関数

概要 ファイルポジションを取得する。
ヘッダ stdio.h
形式 long int ftell(FILE* stream);
引数 stream 対象のストリーム。
戻り値 成功したらファイルポジションが返される。 失敗したら -1L が返される。
ただし、-1L という値は有効なファイルポジションであり得る。 そのため、エラーの確認には errno を使う必要がある。
詳細 返されるファイルポジションは、バイナリストリームでは、ファイルの先頭からのバイト数である。 テキストストリームの場合、バイト数と一致する保証はなく、fseek関数の第2引数へ、 SEEK_SET とともに引き渡すことにしか使えない。
注意 失敗した場合、戻り値として -1L が返されるとともに、errno に何らかの正の値が格納される。 エラーの確認は、errno を使うこと。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	long int pos;


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}


	printf( "%c\n", fgetc( fp ) );
	printf( "%c\n", fgetc( fp ) );
	printf( "%c\n", fgetc( fp ) );

	/* ファイルポジションを取得 */
	errno = 0;
	pos = ftell( fp );
	if( pos == -1L && errno > 0 ){
		fputs( "ftell関数が失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fseek( fp, 0, SEEK_SET );
	printf( "%c\n", fgetc( fp ) );

	/* ファイルポジションを戻す */
	fseek( fp, pos, SEEK_SET );
	printf( "%c\n", fgetc( fp ) );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

abcde

実行結果:

a
b
c
a
d
関連
解説章 第40章

fwprintf関数

概要 任意のストリームへ、フォーマット指定されたワイド文字列を出力する。
ヘッダ stdio.h、wchar.h
形式 int fwprintf(FILE* stream, const wchar_t* format, ...);
引数 stream 出力先のストリーム。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 結果を任意のストリームへ出力することを除き、wprintf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、fwprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	fwprintf( fp, L"%d %3d %03d", 10, 10, 10 );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果 (test.txt)

10  10 010
関連 マルチバイト文字版は、fprintf関数である。
標準出力へ同様のフォーマット指定を行い出力するには、wprintf関数を使う。 変換結果を文字配列に格納するには swprintf関数が使える。
引数... の代わりに、va_list を用いたバージョンとして、vfwprintf関数がある。
解説章

fwrite関数

概要 入力ストリームへ、バイナリデータを書き込む。
ヘッダ stdio.h
形式 size_t fwrite(const void* ptr, size_t size, size_t n, FILE* stream);
引数 ptr 書き込むデータが格納された配列のアドレス。 引数n が 1 であれば、単独の変数のアドレスでも構わない。
size 要素1個のサイズ。
n 要素数。
stream 出力ストリーム。
戻り値 実際に書き込まれた要素数。
エラーが発生した場合には、引数n よりも小さい値が返される。
詳細
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int num = 900;
	double d = 7.85;
	char str[] = "xyzxyz";


	fp = fopen( "test.bin", "wb" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}


	fwrite( &num, sizeof(num), 1, fp );
	fwrite( &d, sizeof(d), 1, fp );
	fwrite( str, sizeof(char), sizeof(str), fp );


	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.bin のテキスト表現)

・ffffff@xyzxyz
関連 バイナリデータの読み込みには fread関数を用いる。
解説章 第42章

fwscanf関数

概要 任意のストリームから、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ wchar.h
形式 int fwscanf(FILE* stream, const wchar_t* format, ...);
引数 stream 対象のストリーム。
format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 結果を任意のストリームから受け取ることを除き、scanf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、fwscanf関数としては無視する。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main(void)
{
	FILE* fp;
	int num;
	char str[10];
	double f;

	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	fwscanf( fp, L"%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果:

100 abc 2.500000
関連 char型を使う fscanf関数がある。
解説章

参考リンク

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル 第5版
 -- C99 まで網羅した最も詳細なリファレンス。
新ANSI C言語辞典
 -- 標準ライブラリについて詳しい。C99 には非対応。

更新履歴

'2017/5/11 FILE の説明を追加。
FILE周りの用語について、表現を見直した。

'2017/5/8 freopen関数の説明を追加。

'2017/4/27 fwprintf関数の説明を追加。

'2017/4/23 fputs関数、fputws関数の説明を追加。

'2017/4/22 fputc関数、fputwc関数の説明を追加。

'2017/4/15 fopen関数の説明を追加。

'2017/3/11 falseマクロの説明を追加。

'2017/3/9 fscanf関数、fwscanf関数の戻り値の説明を修正。

'2017/3/6 floorf関数、floorl関数の説明を追加。

'2017/3/4 fabsf関数、fabsl関数の説明を追加。

'2015/8/29 サンプルプログラム中で、flose関数の戻り値をチェックするようにした。

'2011/7/24 fscanf関数、fwscanf関数の説明を追加。

'2011/5/8 fprintf関数の説明を追加。

'2011/4/23 fgetwc関数、fgetws関数の説明を追加。

'2010/9/14 FILENAME_MAXマクロ、FOPEN_MAXマクロの説明を追加。

'2010/9/12 「FILE構造体」という表記を「ファイル構造体」に改めた。

'2010/8/24 fread関数、fwrite関数の説明を追加。

'2010/8/13 fseek関数、ftell関数の説明を追加。

'2010/7/6 fgetpos関数、fsetpos関数の説明を追加。

'2010/6/16 fflush関数、fgetc関数の説明を追加。

'2010/5/16 fclose関数、feof関数、ferror関数の説明を追加。

'2010/4/3 free関数の説明を追加。

'2009/10/15 FLT_MAX、FLT_MIN の説明を追加。

'2009/9/15 fgets関数の説明を追加。

'2009/8/29 floor関数の説明を追加。

'2009/7/4 新規作成。



標準ライブラリのリファレンスのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ