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

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

getc関数

概要 入力ストリームから1文字受け取る。
ヘッダ stdio.h
形式 int getc(FILE* stream);
引数 stream 入力ストリーム。
戻り値 成功すれば入力された文字が返される。失敗時は EOF が返される。
カレントポジションがファイルの終端のときに呼び出された場合も EOF を返す。
詳細 マクロとして実装されている可能性があるという点を除くと、fgetc関数と同じである。
注意 戻り値として EOF が返された場合、ファイルの終端なのか、何らかのエラーが発生しているのかを区別しなければならない。 前者の場合は feof関数の返す値が真になり、後者の場合は ferror関数の返す値が真になる。
使用例
#include <stdio.h>
#include <stdlib.h>

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


	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	for( i = 0; ; ++i ){
		c = getc( 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
Test Message

実行結果(標準出力)

Hello, World
Test Message
関連 fgetc関数は同じ効果の標準関数だが、必ず関数として実装されている。 標準入力専用の getc関数として、getchar関数がある。
gets関数は、その名称からして getc関数の文字列版のようだが、標準出力専用であること等、まったく異なるものであり、 getc関数の文字列版は fgets関数の方であると考えられる。
C95以降は、ワイド文字版の getwc関数が存在する。
解説章 第41章

getchar関数

概要 標準入力から1文字受け取る。
ヘッダ stdio.h
形式 int getchar(void);
引数 なし
戻り値 成功すれば入力された文字が返される。失敗時は EOF が返される。
カレントポジションがファイルの終端のときに呼び出された場合も EOF を返す。
詳細 標準入力専用である点を除くと、getc関数と同じである。 したがって、マクロとして実装されている可能性がある。
注意 戻り値として EOF が返された場合、ファイルの終端なのか、何らかのエラーが発生しているのかを区別しなければならない。 前者の場合は feof関数の返す値が真になり、後者の場合は ferror関数の返す値が真になる。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int c;

	puts( "文字を入力して下さい。'q' を入力すると終了します。" );

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

	return 0;
}

実行結果:

文字を入力して下さい。'q' を入力すると終了します。
a
a
b
b
abc
abc
q
関連 getc関数は、同じ処理を行うが、対象となる入力ストリームを指定できる。 また、fgetc関数は、確実に関数として実装されている。
C95以降は、ワイド文字版の getwchar関数が存在する。
解説章 第41章

getenv関数

概要 環境から情報を取得する。
ヘッダ stdlib.h
形式 char* getenv(const char* s);
引数 s 検索する環境情報の名前。
戻り値 引数s に一致する情報があれば、その情報の文字列表現へのポインタを返す。 失敗した場合には NULL が返される。
詳細 実行環境が持っている情報を検索して取得する関数である。 これは Windows環境であれば、環境変数のことを指している。
注意 戻り値の型に const は付いていないが、返されたポインタを経由して、文字列を書き換えてはならない。 実際、返される文字列は定数(文字列リテラル)である。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char* str = getenv( "PATH" );
	if( str == NULL ){
		fputs( "環境変数の取得に失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	puts( str );

	return 0;
}

実行結果:

(省略)
関連 system関数は、実行環境に存在するコマンドプロセッサへコマンドを送ることができる。
解説章 第45章

gets関数

概要 標準入力から文字列の入力を受け取る。
ヘッダ stdio.h (C99まで。C11 から削除)
形式 char* gets(char* s);
引数 s 入力文字列を受け取る配列のアドレス。
戻り値 成功時は引数s と同じアドレスが返される。失敗時は NULL が返される。
詳細 「注意」で触れているように、この関数は本質的に危険であり使用すべきではないため、C11規格で削除された。 VisualC++ では 2015 から削除されている。
注意 この関数は、受け取る文字数を指定できないため、バッファオーバーフローを起こす危険がある。 従って、絶対に使ってはならない。
代替手段として、C99規格までは fgets関数を使う。 C11規格では、gets_s関数が存在すればそれを使う(この関数はオプション扱いである)。なければやはり fgets関数を使う。
使用例
#include <stdio.h>

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

	puts( "何か入力して下さい。" );
	gets( str );  /* 80文字以上入力されると危険! */
	puts( str );

	return 0;
}

実行結果:

何か入力して下さい。
abcde
abcde
関連 この関数は危険性があるので、fgets関数などに置き換えることを考えるべきである。 C11規格では、存在するならば gets_s関数を検討すると良い。
解説章 第6章

gets_s関数

getwc関数

概要 入力ストリームから、ワイド文字を1文字受け取る。
ヘッダ stdio.h あるいは wchar.h (いずれも C95以降)
形式 wint_t getwc(FILE* stream);
引数 stream 入力ストリーム。
戻り値 成功すれば入力された文字が返される。失敗時は WEOF が返される。
カレントポジションがファイルの終端のときに呼び出された場合も WEOF を返す。
詳細 マクロとして実装されている可能性があるという点を除くと、fgetwc関数と同じである。
注意 戻り値として WEOF が返された場合、ファイルの終端なのか、何らかのエラーが発生しているのかを区別しなければならない。 前者の場合は feof関数の返す値が真になり、後者の場合は ferror関数の返す値が真になる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

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


	setlocale( LC_CTYPE, "" );

	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	for( i = 0; ; ++i ){
		c = getwc( fp );
		if( c == WEOF ){
			if( feof(fp) ){
				break;
			}
			else if( ferror(fp) ){
				fputs( "読み込み中にエラーが発生しました。\n", stderr );
				exit( EXIT_FAILURE );
			}
		}
		putwchar( c );
	}
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

あいうえお

実行結果(標準出力)

あいうえお
関連 fgetwc関数は同じ効果の標準関数だが、必ず関数として実装されている。 標準入力専用の getwc関数として、getwchar関数がある。
名称からして、getws関数があることを期待するかも知れないが、それは存在しない。 getws関数があるとすれば、それの元となる char型バージョンは gets関数であるが、 gets関数には致命的な問題があるため、ワイド文字バージョンは用意されなかったのだろう。 そのため、文字列版が必要ならば、fgetws関数を使う。
解説章

getwchar関数

概要 標準入力から、ワイド文字を1文字受け取る。
ヘッダ stdio.h あるいは wchar.h (いずれも C95以降)
形式 wint_t getwchar(void);
引数 なし
戻り値 成功すれば入力された文字が返される。失敗時は WEOF が返される。
カレントポジションがファイルの終端のときに呼び出された場合も WEOF を返す。
詳細 標準入力専用である点を除くと、getwc関数と同じである。 したがって、マクロとして実装されている可能性がある。
注意 戻り値として WEOF が返された場合、ファイルの終端なのか、何らかのエラーが発生しているのかを区別しなければならない。 前者の場合は feof関数の返す値が真になり、後者の場合は ferror関数の返す値が真になる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
	wint_t c;


	setlocale( LC_CTYPE, "" );

	puts( "文字を入力して下さい。'q' を入力すると終了します。" );

	while( 1 ){
		c = getwchar();
		if( c == WEOF ){
			if( feof(stdin) ){
				break;
			}
			else if( ferror(stdin) ){
				fputs( "読み込み中にエラーが発生しました。\n", stderr );
				exit( EXIT_FAILURE );
			}
		}
		else if( c == L'q' ){
			break;
		}
		putwchar( c );
	}

	return 0;
}

実行結果:

文字を入力して下さい。'q' を入力すると終了します。
a
a
b
b
abc
abc
q
関連 getwc関数は、同じ処理を行うが、対象となる入力ストリームを指定できる。 また、fgetwc関数は、確実に関数として実装されている。
解説章

gmtime関数

概要 カレンダー時間から、協定世界時(UTC) を得る。
ヘッダ time.h
形式 struct tm* gmtime(const time_t* t);
引数 t カレンダー時間が格納されているアドレス。
戻り値 UTC が格納された位置を指すポインタが返される。 失敗した場合は NULL が返される。
詳細
注意 返されるポインタが指す先は、次回の gmtime関数の呼び出し時に再利用され、上書きされる可能性がある。 この関数だけでなく、ctime関数localtime関数でも、同じ場所を上書きしている可能性がある。
使用例
#include <stdio.h>
#include <time.h>

int main(void)
{
	struct tm* utc;
	time_t t;
	
	t = time( NULL );
	utc = gmtime( &t );

	puts( asctime( utc ) );

	return 0;
}

実行結果

Sun Apr 03 04:07:27 2011
関連 カレンダー時間から、ローカル時間を得るには localtime関数を使う。
解説章 第51章

参考リンク

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

更新履歴

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

'2013/4/27 gets関数が C11 で削除されたことを追記。

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

'2011/4/23 getwc関数、getwchar関数の説明を追加。

'2010/8/24 getenv関数の説明を追加。

'2010/5/19 getc関数、getchar関数の説明を追加。

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

'2008/11/22 新規作成。



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

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

Programming Place Plus のトップページへ