C言語/標準ライブラリ/入出力

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

目次

概要[編集]

入出力の関数を使用するためには、 stdio.hというヘッダファイルを組み込む必要がある。 [1]

ストリーム[編集]

[2]

ストリーム(stream)とは、物理装置やファイルなどに対する入出力を統一的に扱う概念である。 ストリームには、テキストストリーム(text stream)とバイナリストリーム(binary stream)の2種類がある。

テキストストリームは、行(line)を構成する順序づけた文字の並びである。 テキストとは、メモ帳(notepad.exe)などのテキストエディタでデータを閲覧したときのように、データをテキスト形式で処理する。

バイナリストリームは、内部データをそのまま記録することのできる順序付けされた文字の並びである。 バイナリとは、バイナリエディタでデータを閲覧したときのように、データをバイナリ形式で処理する。

各々のストリームは、入出力単位(orientation)をもっている。 入出力単位には、 入出力単位を持たない、 ワイド文字単位のストリーム(wide-oriented stream)、 バイト単位のストリーム(byte-oriented stream)、 がある。

ファイル[編集]

[3]

ファイルに対する操作は次のような手順で行う。

  1. FILEポインタを宣言する。
  2. ファイルをオープン(open)する。
  3. ファイルにデータを入出力する。
  4. ファイルをクローズ(close)する。(ただし、main関数が最初の呼び出し元に戻る場合又はexit関数が呼ばれた場合、すべてのオープンされているファイルをプログラム終了前にクローズする。)

プログラム開始時に3つのテキストストリームがあらかじめ定義されている。

  • stdinは、通常の入力を読み取るための標準入力(standard input)である。
  • stdoutは、通常の出力を書き込むための標準出力(standard output)である。
  • stderrは、診断出力を書き込むための標準エラー(standard error)である。

[編集]

入出力<stdio.h>には、一定の手順で呼び出さなければならない関数が多い。 そこで、用途別にいくつかの例を挙げておくこととする。

例:テキストファイルの読み書き[編集]

テキストファイルへ書き込む場合、fopen関数の第二引数に"w"などを指定する。 テキストファイルから読み込む場合、fopen関数の第二引数に"r"などを指定する。

//例 fprintf、fscanf関数を用いたテキストファイルの読み書き
#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.txt";
	char str[16]="";

	//ファイルへ文字列を出力する。
	if((fp=fopen(filename, "w"))==NULL){//ファイルをテキスト書き込みモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fprintf(fp, "Hello,World!\n");//ファイルへ文字列を書き込む。
	fclose(fp);//ファイルをクローズする。

	//ファイルから文字列を入力する。
	if((fp=fopen(filename, "r"))==NULL){//ファイルをテキスト読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fscanf(fp, "%15s", str);//ファイルから文字列を読み込む。
	fclose(fp);//ファイルをクローズする。

	//文字列を表示する。
	printf("%s", str);
}

リンク:#fopen関数#fprintf関数#fclose関数#fscanf関数

//例 fputc、fgetc関数を用いたテキストファイルの読み書き
#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.txt";
	char c;

	//ファイルへ文字を出力する。
	if((fp=fopen(filename, "w"))==NULL){//ファイルをテキスト書き込みモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fputc('a', fp);//ファイルへ文字を書き込む。
	fclose(fp);//ファイルをクローズする。

	//ファイルから文字を入力する。
	if((fp=fopen(filename, "r"))==NULL){//ファイルをテキスト読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	c=fgetc(fp);//ファイルから文字を読み込む。
	fclose(fp);//ファイルをクローズする。

	//文字を表示する。
	printf("%c", c);
}

リンク:#fopen関数#fputc関数#fclose関数#fgetc関数

//例 fputs、fgets関数を用いたテキストファイルの読み書き
#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.txt";
	char str[16]="";

	//ファイルへ文字列を出力する。
	if((fp=fopen(filename, "w"))==NULL){//ファイルをテキスト書き込みモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fputs("Hello,World!\n", fp);//ファイルへ文字列を書き込む。
	fclose(fp);//ファイルをクローズする。

	//ファイルから文字列を入力する。
	if((fp=fopen(filename, "r"))==NULL){//ファイルをテキスト読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fgets(str, sizeof(str), fp);//ファイルから文字列を読み込む。
	fclose(fp);//ファイルをクローズする。

	//文字列を表示する。
	printf("%s", str);
}

リンク:#fopen関数#fputs関数#fclose関数#fgets関数

例:バイナリファイルの読み書き[編集]

バイナリファイル[4]へ書き込む場合、fopen関数の第二引数に"wb"などを指定する。 バイナリファイルから読み込む場合、fopen関数の第二引数に"rb"などを指定する。

#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.dat";
	int i=1234;

	//ファイルへ数値を出力する。
	if((fp=fopen(filename, "wb"))==NULL){//ファイルをバイナリ書き込みモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fwrite(&i, sizeof(int), 1, fp);//ファイルへ数値を書き込む。
	fclose(fp);//ファイルをクローズする。

	//ファイルから数値を入力する。
	if((fp=fopen(filename, "rb"))==NULL){//ファイルをバイナリ読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	fread(&i, sizeof(int), 1, fp);//ファイルから数値を読み込む。
	fclose(fp);//ファイルをクローズする。

	//数値を表示する。
	printf("%d", i);
}

リンク:#fopen関数#fwrite関数#fclose関数#fread関数

例:printf関数での変換指定の使い方[編集]

printf関数などでは、フラグ、最小フィールド幅、精度などを指定することで、様々な書式で文字列を出力することができる。

#include <stdio.h>

int main(void)
{
	int i=1234;
	double pi=3.14159265359;
	//フラグの使い方
	printf("%8d\n", i);	//「    1234(改行)」と表示される。
	printf("%-8d\n", i);	//「1234    (改行)」と表示される。
	printf("%+d\n", i);	//「+1234(改行)」と表示される。
	printf("% d\n", i);	//「 1234(改行)」と表示される。
	printf("%#o\n", i);	//「02322(改行)」と表示される。
	printf("%#x\n", i);	//「0x4d2(改行)」と表示される。
	printf("%08d\n", i);	//「00001234(改行)」と表示される。
	//最小フィールド幅の使い方
	printf("%8d\n", i);	//「    1234(改行)」と表示される。
	//精度の使い方
	printf("%.2f", pi);	//「3.14(改行)」と表示される。
}

リンク:#printf関数

例:scanf関数での変換指定の使い方[編集]

scanf関数などでは、代入抑止文字、最大フィールド幅、走査文字集合などを指定することで、様々な書式で文字列を入力することができる。

//例 代入抑止文字*の使用例
#include <stdio.h>

int main(void)
{
	char c;
	printf("\n2文字の文字を入力してください:");
	scanf("%*c%c", &c);	//1文字目を読み飛ばし、2文字目を入力する。
	printf("\n入力した2文字目は%cです。", c);
}

リンク:#printf関数#scanf関数

//例 最大フィールド幅の使用例
#include <stdio.h>

int main(void)
{
	char str[16];
	printf("\n15文字の文字列を入力してください:");
	scanf("%15s", str);	//15文字入力する。
	printf("\n入力した文字列は%sです。", str);
}

リンク:#printf関数#scanf関数

//例 走査文字集合の使用例
#include <stdio.h>

int main(void)
{
	char str[2]="";
	printf("\nyまたはnを入力してください:");
	scanf("%1[yn]", &str);	//ynのみを入力する。
	printf("\n入力した文字は%cです。", str[0]);
}

リンク:#printf関数#scanf関数

例:fgetpos関数とfsetpos関数の使い方[編集]

#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.txt";
	fpos_t pos_first, pos_second;
	
	if((fp=fopen(filename, "w+"))==NULL){//ファイルをテキストファイルの更新(書き込み及び読み取り)モードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}

	//最初のファイル位置表示子を取得し表示する。
	fgetpos(fp, &pos_first);
	printf("最初のファイル位置表示子は%ld\n", pos_first);

	//文字列を書き込んでから、ファイル位置表示子を取得し表示する。
	fprintf(fp, "Hello,World!\n");//ファイルへ文字列を書き込む。
	fgetpos(fp, &pos_second);
	printf("文字列を書き込んだ後のファイル位置表示子は%ld\n", pos_second);	

	//最初のファイル位置表示子に設定する。
	if(fsetpos(fp, &pos_first)==0){
		//元に戻したファイル位置表示子を取得し表示する。
		fgetpos(fp, &pos_first);
		printf("元に戻したファイル位置表示子は%ld\n", pos_first);
	}else{
		printf("fsetpos関数に失敗しました。");
	}

	fclose(fp);//ファイルをクローズする。
}

リンク:#fopen関数#fgetpos関数#fprintf関数#fsetpos関数#fclose関数

例:fseek関数とftell関数の使い方[編集]

//getfilesize.c
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;

	if(argc<2){//コマンドライン引数をチェック
		printf("getfilesize ファイル名\n");
		return 1;
	}
	
	if((fp=fopen(argv[1], "rb"))==NULL){//ファイルをバイナリファイルの読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}

	//ファイルサイズを取得し表示する。
	fseek(fp, 0L, SEEK_END);
	printf("%sのファイルサイズは%ldバイトです。\n", argv[1], ftell(fp));

	fclose(fp);//ファイルをクローズする。
}

リンク:#fopen関数#fseek関数#ftell関数#fclose関数

例:clearerr関数とfeof関数の使い方[編集]

//feof.c
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;
	char c;

	if(argc<2){//コマンドライン引数をチェック
		printf("feof ファイル名\n");
		return 1;
	}

	if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}

	//ファイル終了表示子がセットされるまで、ファイルから文字を読み込む。
	while(feof(fp)==0){
		c=fgetc(fp);
	}

	//ファイル終了表示子がセットされているか判定し表示する。
	if(feof(fp)!=0)
		printf("ファイル終了表示子がセットされています。\n");
	else
		printf("ファイル終了表示子がセットされていません。\n");

	clearerr(fp);//ファイル終了表示子をクリアする。

	//ファイル終了表示子がセットされているか判定し表示する。
	if(feof(fp)!=0)
		printf("ファイル終了表示子がセットされています。\n");
	else
		printf("ファイル終了表示子がセットされていません。\n");

	fclose(fp);//ファイルをクローズする。
}

リンク:#fopen関数#feof関数#fgetc関数#clearerr関数#fclose関数

例:clearerr関数とferror関数の使い方[編集]

//ferror.c
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;
	char c;

	if(argc<2){//コマンドライン引数をチェック
		printf("ferror ファイル名\n");
		return 1;
	}

	if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}

	//ファイルへ文字を書き込む。
	fputc('a', fp);

	//エラー表示子がセットされているか判定し表示する。
	if(ferror(fp)!=0)
		printf("エラー表示子がセットされています。\n");
	else
		printf("エラー表示子がセットされていません。\n");

	clearerr(fp);//エラー表示子をクリアする。

	//エラー表示子がセットされているか判定し表示する。
	if(ferror(fp)!=0)
		printf("エラー表示子がセットされています。\n");
	else
		printf("エラー表示子がセットされていません。\n");

	fclose(fp);//ファイルをクローズする。
}

リンク:#fopen関数#fputc関数#ferror関数#clearerr関数#fclose関数

概説[編集]

[5]

ヘッダ<stdio.h>には、3つの型、幾つかのマクロ及び入出力を行う幾つかの関数がある。

[編集]

  • size_t
size_tは、sizeof演算子の結果の符号なし整数型とする。[6]
  • FILE
FILEは、ファイル位置表示子、結び付けられたバッファへのポインタ、エラー表示子、ファイル終了表示子など、ストリームを制御するために必要なすべての情報を記録することのできるオブジェクト型である。
ファイル位置表示子(file position indicator)とは、現在アクセスしているストリームの位置情報を保持する。[7]
エラー表示子(error indicator)とは、読み取りエラーまたは書き込みエラーが起こったかどうかを記録する。
ファイル終了表示子(end-of-file indicator)とは、ファイルの終わりに達したかどうかを記録する。
  • fpos_t
fpos_tは、ファイルの中の任意の位置を一意に指定するために必要なすべての情報を記録することが可能な配列型以外のオブジェクト型である。

マクロ[編集]

  • NULL
NULLは、処理系定義の空ポインタ定数に展開する。[6]
  • _IOFBF、_IOLBF、_IONBF
setvbuf関数の第3実引数として使用するために適した別々の値をもつ整数定数式。#setvbuf関数を参照せよ。
  • BUFSIZ
setbuf関数によって使われるバッファの大きさを表す整数定数式。#setbuf関数を参照せよ。
  • EOF
ファイルの終わり(end-of-file)を示す、int型の負の値をもつ整数定数式。
  • FOPEN_MAX
同時にオープンできることを処理系が保証するファイル数の最小値を表す整数定数式。
  • FILENAM_MAX
オープンできることを処理系が保証する最大長のファイル名文字列を保持するのに、char型の配列が必要とする十分な大きさを表す整数定数式。
  • L_tmpnam
tmpnam関数によって生成される一時ファイルを保持するのに、char型の配列が必要とする十分な大きさを表す整数定数式。#tmpnam関数を参照せよ。
  • SEEK_CUR、SEEK_END、SEEK_SET
fseek関数の第3実引数として使用するために適した別々の値をもつ整数定数式。#fseek関数を参照せよ。
  • TMP_MAX
tmpnam関数によって生成される一意なファイル名の最大個数を表す整数定数式。#tmpnam関数を参照せよ。
  • stderr、stdin、stdout
それぞれ標準エラー、標準入力及び標準出力ストリームに結び付けられたFILEオブジェクトを指す型「FILEへのポインタ」をもつ式。

ファイルに対する操作[編集]

[8]

remove関数[編集]

[9]

  • 形式
#include <stdio.h>
int remove(const char *filename);
  • 引数
filename 削除するファイルの名前
  • 返却値
操作が成功したときは0、失敗したときは0以外の値
  • 機能
filenameが指す名前のファイルを削除する。
そのファイルがオープンされているときの動作は処理系定義である。
#include <stdio.h>

int main(void)
{
	char filename[256];
	printf("削除するファイルの名前を入力してください。:");
	scanf("%256s", filename);
	if(remove(filename)==0)
		printf("%sを削除しました。\n", filename);
	else
		printf("削除に失敗しました。\n");
}

rename関数[編集]

[10]

  • 形式
#include <stdio.h>
int rename(const char *old, const char *new);
  • 引数
old 変更前のファイルの名前
new 変更後のファイルの名前
  • 返却値
操作が成功したときは0、失敗したときは0以外の値
  • 機能
oldが指す名前のファイルを、newが指す名前のファイルへ、ファイル名を変更する。
変更後のファイルの名前を持つファイルが既に存在した場合の動作は処理系定義である。
失敗のときには、rename関数の呼び出し前に存在していたファイルは、元の名前でアクセス可能である。
#include <stdio.h>

int main(void)
{
	char oldfilename[256], newfilename[256];

	printf("リネーム前のファイル名を入力してください。:");
	scanf("%256s", oldfilename);

	printf("リネーム後のファイル名を入力してください。:");
	scanf("%256s", newfilename);

	if(rename(oldfilename, newfilename)==0)
		printf("%sを%sへリネームしました。\n", oldfilename, newfilename);
	else
		printf("リネームに失敗しました。\n");
}

tmpfile関数[編集]

[11]

  • 形式
#include <stdio.h>
FILE *tmpfile(void);
  • 引数
なし
  • 返却値
生成したファイルのストリームへのポインタ。ファイルが生成できなかった場合、空ポインタ。
  • 機能
一時バイナリファイルを生成し、そのストリームへのポインタを返す。
生成したファイルは、クローズ時又はプログラム終了時に、自動的に削除される。
プログラムが異常終了したとき、オープン中の一時ファイルが削除されるかは処理系定義である。
tmpfile関数は一時ファイルを"wb+"モードでオープンする。
#include <stdio.h>

int main(void)
{
	FILE *fp;

	if((fp=tmpfile())==NULL)
		printf("一次バイナリファイルの生成に失敗しました。\n");
	else
		printf("一次バイナリファイルの生成に成功しました。\n");

	//一次バイナリファイルへの入出力処理など

	fclose(fp);
}

tmpnam関数[編集]

[12]

  • 形式
#include <stdio.h>
char *tmpnam(char *s);
  • 引数
s NULL又は生成した文字列を格納する配列
  • 返却値
適当な文字列が生成できない場合は空ポインタを返す。
生成できた場合は次の2つの場合がある。
sを指定しなかった場合(空ポインタの場合)、生成した文字列を内部の静的なオブジェクトに残し、そのオブジェクトへのポインタを返す。
この場合、その後のtmpnam関数の呼び出しで、そのオブジェクトが変更されることもある。
sを指定した場合(空ポインタでない場合)、生成した文字列をsに書き込み、sを返す。
この場合、sは要素数が少なくともL_tmpnam個であるchar型の配列を指しているものと仮定される。
  • 機能
ファイル名として正しく、既存のファイル名と一致しない文字列を生成する。
TMPMAXの数だけ異なる文字列を生成できる。
しかし、その中のいずれか又は全てが既存のファイルで用いられている可能性があるため、返却値に利用できないこともある。
呼び出しごとに異なる文字列を生成する。
#include <stdio.h>

int main(void)
{
	char filename[L_tmpnam]="";

	tmpnam(filename);

	printf("ファイル名として正しく、既存のファイル名と一致しない文字列は%sです。\n", filename);
}

ファイルアクセス関数[編集]

[13]

fclose関数[編集]

[14]

  • 形式
#include <stdio.h>
int fclose(FILE *stream);
  • 引数
stream クローズするファイルのストリーム
  • 返却値
成功した場合0を返し、失敗した場合EOFを返す。
  • 機能
streamが指すファイルのストリームをフラッシュし、そのストリームのファイルをクローズする。

#例:テキストファイルの読み書き及び#例:バイナリファイルの読み書きを参照せよ。

fflush関数[編集]

[15] [16]

  • 形式
#include <stdio.h>
int fflush(FILE *stream);
  • 引数
stream フラッシュするファイルのストリーム
  • 返却値
成功した場合0を返し、失敗した場合エラー表示子をセットし、EOFを返す。
  • 機能
streamが指すファイルのストリームをフラッシュする。
フラッシュとは、まだ書き込まれていないバッファの内容を、ホスト環境に送ることである。
#include <stdio.h>
#include <windows.h>//Sleep関数を使うためにインクルード

int main(void)
{
	char buf[BUFSIZ];
	setbuf(stdout, buf);//標準出力に対して、完全バッファリングで、bufをバッファとして設定する。

	printf("Hello, world!\n");//バッファへ出力される。

	Sleep(1000);//1000ミリ秒待つ。

	fflush(stdout);//バッファから出力される。
}

fopen関数[編集]

[17]

  • 形式
#include <stdio.h>
FILE *fopen(const char * restrict filename, const char * restrict mode);
  • 引数
filename オープンするファイルの名前
mode モード
  • 返却値
オープンしたファイルのストリームを返す。オープン操作が失敗した場合、空ポインタを返す。
  • 機能
filenameが指す名前のファイルを、modeで指定したモードで、オープンする。
modeは次の表のいずれかの文字列を指定する。
次の表以外の文字列の時、動作は未定義である。
文字列 モード
r テキストファイルの読み取りモード
w テキストファイルの書き込みモード
a テキストファイルの追加書き込みモード
rb バイナリファイルの読み取りモード
wb バイナリファイルの書き込みモード
ab バイナリファイルの追加書き込みモード
r+ テキストファイルの更新(読み取り及び書き込み)モード
w+ テキストファイルの更新(書き込み及び読み取り)モード
a+ テキストファイルの更新(読み取りおよび追加書き込み)モード
r+b又はrb+ バイナリファイルの更新(読み取り及び書き込み)モード
w+b又はwb+ バイナリファイルの更新(書き込み及び読み取り)モード
a+b又はab+ バイナリファイルの更新(読み取りおよび追加書き込み)モード
オーブン時に、ストリームに対するエラー表示子とファイル終了表示子をクリアする。

#例:テキストファイルの読み書き及び#例:バイナリファイルの読み書きを参照せよ。

freopen関数[編集]

[18]

  • 形式
#include <stdio.h>
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE restrict stream);
  • 引数
filename オープンするファイル名
mode モード
stream オープンするファイルのストリーム
  • 返却値
オープンが失敗した場合、空ポインタを返す。成功した場合streamの値を返す。
  • 機能
streamが指すファイルをクローズしてから、filenameが指すファイルを、modeで指定したモードで、オープンする。
そして、ストリームのエラー表示子とファイル終了表示子をクリアする。
例えば、stdin、stdout、stderrなどを変更することができる。[19]
modeは#fopen関数を参照せよ。
#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="example.txt";

	if((fp=freopen(filename, "w", stdout))==NULL){
		printf("再オープンに失敗しました。");
		return 1;
	}

	printf("Hello, world!\n");//example.txtへ出力される。

	fclose(fp);//ファイルをクローズする。
}

setbuf関数[編集]

[20]

  • 形式
#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf);
  • 引数
stream バッファを設定するファイルのストリーム
buf バッファとする配列
  • 返却値
なし
  • 機能
streamが指すファイルのストリームに対して、bufが指す配列をバッファとした、入出力用のバッファを設定する。
setbuf関数は、modeを_IOFBF, sizeをBUFSIZとしたsetvbuf関数と同じである。
ただし、bufが空ポインタの場合、modeを_IONBFとしたsetvbuf関数と同じである。
#include <stdio.h>
#include <windows.h>//Sleep関数を使うためにインクルード

int main(void)
{
	//標準出力を完全バッファリングする
	char buf[BUFSIZ];
	setbuf(stdout, buf);//標準出力に対して、完全バッファリングで、bufをバッファとして設定する。

	printf("Hello, world!\n");//バッファへ出力される。

	Sleep(1000);//1000ミリ秒待つ。

	fflush(stdout);//バッファから出力される。

	//標準出力をバッファリングしない
	setbuf(stdout, NULL);

	printf("Hello, world2!\n");//そのまま出力される。

	Sleep(1000);//1000ミリ秒待つ。
}

setvbuf関数[編集]

[21] [22]

  • 形式
#include <stdio.h>
int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);
  • 引数
stream バッファを設定するファイルのストリーム
buf バッファとする配列
mode バッファリングの方法
size バッファの大きさ
  • 返却値
成功した場合0を返し、modeに無効な値が指定された場合、又は要求に従うことができなかった場合、0以外の値を返す。
  • 機能
streamが指すファイルのストリームに対して、sizeの大きさを持ったbufが指す配列をバッファとし、modeで指定したバッファリングの方法で、入出力用のバッファを設定する。
bufにNULLを指定した場合、setvbuf関数がsizeの大きさを持ったバッファを割り付ける。
modeは以下の表のいずれかを指定する。
モード 意味
_IOFBF 完全バッファリング バッファがいっぱいになった時点で、ホスト環境へ又はホスト環境から文字をブロック単位で転送する。
_IOLBF 行バッファリング 改行文字に達した時点で、ホスト環境へ又はホスト環境から文字をブロック単位で転送する。
_IONBF バッファリングをしない 文字が入力元から又は出力先へ可能な限りすぐ現れる。
#include <stdio.h>
#include <windows.h>//Sleep関数を使うためにインクルード

int main(void)
{
	//標準出力を行バッファリングする
	char buf[BUFSIZ];
	setvbuf(stdout, buf, _IOLBF, sizeof(buf));//標準出力に対して、行バッファリングで、bufをバッファとして設定する。

	printf("Hello, world!");//バッファへ出力される。

	Sleep(1000);//1000ミリ秒待つ。

	printf("\n");//バッファから出力される。

	//標準出力をバッファリングしない
	setvbuf(stdout, NULL, _IONBF, 0);

	printf("Hello, world2!");//そのまま出力される。

	Sleep(1000);//1000ミリ秒待つ。

	printf("\n");//そのまま出力される。
}

書式付き入出力関数[編集]

[23]

fprintf関数[編集]

[24]

  • 形式
#include <stdio.h>
int fprintf(FILE * restrict stream, const char * restrict format, ...)
  • 引数
stream ストリーム
format 書式文字列
... 任意個数の実引数
  • 返却値
書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。
  • 機能
fprintf関数とは、formatが指す書式文字列に従って、streamが指すストリームへ書き込む関数である。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。書式文字列に含まれる変換指定の部分が、それに対応する後の実引数の値によって置換される。
変換指定は以下のようになる。
%[フラグ][最小フィールド幅][.][精度][長さ修飾子]変換指定子
「[]」は省略可能であることを示す。
フラグとは、
  • 「-」を指定することで、変換結果をフィールド内に左詰めにする(デフォルトで右詰)。
  • 「+」を指定することで、符号付き変換の結果を常に正符号又は負符号で始める(デフォルトで負の値の場合のみ負符号で始める)。
  • 「 (空白)」を指定することで、符号付き変換の結果の最初の文字が符号でない場合、1個の空白を結果の前に付ける。
  • 「#」を指定することで、変換指定子がoなら「0」を、xなら「0x」を、Xなら「0X」を結果の前に付加する。変換指定子がa, A, e, E, f, F, g, Gなら、小数点文字の後ろに数字が続かない場合でも、浮動小数点数の返還の結果に常に小数点文字を含める。変換指定子がg, Gなら、後ろの続く0を結果から取り除かない。
  • 「0」を指定することで、0を文字列の左に付加することができる。
最小フィールド幅とは、値を変換した結果の文字数が最小フィールド幅より少ない場合、最小フィールド幅を満たすまで左側に(-フラグがあるときは右側に)空白を詰めることである。
精度とは、変換指定子がd, i, u, x, Xなら、出力する数字の最小の個数を指定する。変換指定子がa, A, e, E, f, Fなら、小数点文字の後ろに出力すべき数字の個数を指定する。変換指定子がg, Gなら、最大の有効桁数を指定する。変換指定子がsなら、書き込む最大のバイト数を指定する。
長さ修飾子とは、hh, h ,l, ll, j, z, t, Lのいずれかで、それぞれchar, short, long, long long, intmax_t, size_t, ptrdiff_t, long doubleに対応することを指定する。
  • 次に主な変換指定子を表にまとめた。
変換指定 意味
%d, %i 実引数を符号付き10進表記に変換する
%u 実引数を符号無し10進表記に変換する
%o 実引数を符号無し8進表記に変換する
%x, %X 実引数を符号無し16進表記に変換する
%xは英字abcdefを、%Xは英字ABCDEFを用いる
%f, %F 実引数を小数形式の10進浮動小数点数表記に変換する
%e, %E 実引数を指数形式の10進浮動小数点数表記に変換する
%g, %G 実引数を小数形式または指数形式の10進浮動小数点数表記に変換する
%a, %A 実引数を指数形式の16進浮動小数点数表記に変換する
%c 実引数を文字に変換する
%s 実引数を文字列に変換する
%p ポインタの値に変換する
%n 整数変数に出力した文字数を格納する
%% 「%」を出力する
  • 逆斜線表記

[25]

書式文字列には、逆斜線表記(エスケープシーケンス)を含めることもできる。 逆斜線表記とは、\に文字が続くことで特別な意味を表すものである。 以下のような逆斜線表記がある。
逆斜線表記 意味
\n 改行(New line)
現在の印字位置を次の行の先頭位置に移動する
\t タブ(horizontal Tab)
次の水平タブ位置に移動する
\b バックスペース(Backspace)
現在の行で前に移動する。先頭にある場合は不定。
\r キャリッジリターン(carriage Return)
現在の行の先頭位置に移動
\f ページフィード(Form Feed)
次の論理ページの最初に移動
\' シングルクォーテーション(single quotation mark)
一重引用符
\" ダブルクォーテーション(double quotation mark)
二重引用符
\0 ヌル文字(null)
空文字
\\ 円記号(\)
\? クエスチョンマーク
\a ベル音(Alert)
ベル音を鳴らす。印字位置は不変
\xhh 16進拡張(heXadecimal)
16進でhhのコードを持つ文字
\ooo 8進拡張(octal)
8進でoooのコードを持つ文字
#例:テキストファイルの読み書きを参照せよ。
#例:printf関数での変換指定の使い方を参照せよ。

fscanf関数[編集]

[26]

  • 形式
#include <stdio.h>
int fscanf(FILE * restrict stream, const char * restrict format, ...);
  • 引数
stream ストリーム
format 書式文字列
... 任意個数の実引数
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
fscanf関数とは、formatが指す書式文字列に従って、streamが指すストリームから入力を、任意個数の実引数へ読み込む関数である。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。ストリームからの入力が、書式文字列に含まれる変換指定に従って、それに対応する後の実引数が指す変数に代入される。
変換指定は以下のようになる。
%[*][最大フィールド幅][長さ修飾子]変換指定子
「[]」は省略可能であることを示す。
「*」とは、代入抑止文字である。「*」を指定すると、入力は変換されず、読み飛ばされる。
最大フィールド幅とは、最大フィールド幅(文字で数えて)を指定する正の10進整数である。入力から指定した文字数だけ変換される。
長さ修飾子とは、hh, h, l, ll, j, z, t, Lのいずれかである。hh, h, l, ll, j, z, t, Lとは、それぞれchar, short, long, long long, intmax_t, size_t, ptrdiff_t, long doubleに対応することを指定する。
  • 次に主な変換指定子を表にまとめた。
変換指定 意味
%d 入力を符号付き10進整数に変換する
%i 入力を符号付き整数に変換する
%u 入力を符号無し10進整数に変換する
%o 入力を符号無し8進整数に変換する
%x 入力を符号無し16進整数に変換する
%a, %e, %f, %g 入力を浮動小数点数に変換する
%c 入力を文字に変換する
%s 入力を文字列に変換する
%p 入力をポインタの値に変換する
%n 整数変数に入力した文字数を格納する
%% 1つの%と照合する
%[走査文字の並び] 走査文字の並びに含まれる文字のみを入力し、文字列に変換する。
[の直後に^を指定した場合、走査文字の並びに含まれない文字のみを入力し、文字列に変換する。
任意個数の実引数では、単項&演算子を用いて、次のように記述する。
&変数の識別子
これはfscanf関数の内部で、この変数の識別子が指す変数に対して代入するために必要な記述である。単項&演算子については、ここではこれ以上説明しない。詳細についてはC言語/ポインタを参照せよ。
#例:テキストファイルの読み書きを参照せよ。
#例:scanf関数での変換指定の使い方を参照せよ。

printf関数[編集]

[27]

  • 形式
#include <stdio.h>
int printf(const char * restrict format, ...);
  • 引数
format 書式文字列
... 任意個数の実引数
  • 返却値
書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。
  • 機能
printf関数とは、formatが指す書式文字列に従って、標準出力へ書き込む関数である。
printf関数は、与えられた実引数の前にstdoutを実引数として付加したfprintf関数と等価である。詳しくは#fprintf関数を参照せよ。
printf関数の基本的な使い方は、C言語/基礎知識#printf関数の使用例を参照せよ。
#例:printf関数での変換指定の使い方を参照せよ。

scanf関数[編集]

[28]

  • 形式
#include <stdio.h>
int scanf(const char * restrict format, ...);
  • 引数
format 書式文字列
... 任意個数の実引数
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
scanf関数とは、formatが指す書式文字列に従って、標準入力を、任意個数の実引数へ読み込む関数である。
scanf関数は、与えられた実引数の前にstdinを実引数として付加したfscanf関数と等価である。詳しくは#fscanf関数を参照せよ。
scanf関数の基本的な使い方は、C言語/基礎知識#scanf関数の使用例を参照せよ。
#例:scanf関数での変換指定の使い方を参照せよ。

snprintf関数[編集]

[29]

  • 形式
#include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
  • 引数
s 配列
n 書き込む文字数
format 書式文字列
... 任意個数の実引数
  • 返却値
nが十分に大きい場合に配列に書き込んだはずの文字数。ただし、終端ナル文字は数えない。表現形式エラーが発生した場合、負の値を返す。すなわち、返却値が非負かつn未満の場合、そしてその場合に限り、ナル文字で終了している出力が完全に書き込まれている。
  • 機能
snprintf関数とは、formatが指す書式文字列に従って、nで指定した書き込む文字数分だけ、sが指す配列へ書き込む関数である。
snprintf関数は、生成された出力をストリームではなく実引数sで指定する配列に書き込むことを除いては、fprintf関数と等価である。詳しくは#fprintf関数を参照せよ。
書き込む文字数にはナル文字を含む。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdio.h>

int main(void)
{
	char s[16];
	int i=1234;
	double d=3.14;
	char c='a';
	char s2[]="Hello";

	snprintf(s,  sizeof(s), "%d %.2f %c %s", i, d, c, s2);

	printf("%s", s);
}
#例:printf関数での変換指定の使い方を参照せよ。

sprintf関数[編集]

[30]

warning!

sprintf関数は配列へ書き込む文字数を指定できないため
使い方によってはバッファオーバーランが発生する場合があります。
  • 形式
#include <stdio.h>
int sprintf(char * restrict s, const char * restrict format, ...);
  • 引数
s 配列
format 書式文字列
... 任意個数の実引数
  • 返却値
配列に書き込まれた文字数。ただし、ナル文字は文字数に数えない。表現形式エラーが発生した場合、負の値。
  • 機能
sprintf関数とは、formatが指す書式文字列に従って、sが指す配列へ書き込む関数である。
sprintf関数は、生成された出力をストリームではなく実引数sで指定する配列に書き込むことを除いては、fprintf関数と等価である。詳しくは#fprintf関数を参照せよ。
書き込まれた出力文字の列の後にナル文字を書き込む。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdio.h>

int main(void)
{
	char s[32];
	int i=1234;
	double d=3.14;
	char c='a';
	char s2[]="Hello";

	sprintf(s, "%d %.2f %c %s", i, d, c, s2);

	printf("%s", s);	
}
#例:printf関数での変換指定の使い方を参照せよ。

sscanf関数[編集]

[31]

  • 形式
#include <stdio.h>
int sscanf(const char * restrict s, const char * restrict format, ...);
  • 引数
s 文字列
format 書式文字列
... 任意個数の実引数
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
sscanf関数とは、formatが指す書式文字列に従って、sが指す文字列を、任意個数の実引数へ読み込む関数である。
sscanf関数は、入力をストリームではなく実引数sで指定される文字列から得ることを除けば、fscanf関数と等価である。詳しくは#fscanf関数を参照せよ。
文字列の終わりに達することが、fscanf関数でファイルの終わりに達することと等価である。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdio.h>

int main(void)
{
	char s[]="1234 3.14 a Hello";
	int i;
	double d;
	char c;
	char s2[16];

	sscanf(s, "%d %lf %c %15s", &i, &d, &c, &s2);

	printf("i=%d, d=%.2f, c=%c, s2=%s", i, d, c, s2);
}
#例:scanf関数での変換指定の使い方を参照せよ。

vfprintf関数[編集]

[32]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg);
  • 引数
stream ストリーム
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。
  • 機能
vfprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、streamが指すストリームへ書き込む関数である。
vfprintf関数は、可変個数の実引数並びを、argで置き換えたfprintfと等価である。詳しくは#fprintf関数を参照せよ。
vfprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vfprintf関数はva_endマクロを呼び出さない。
#include <stdarg.h>
#include <stdio.h>

//fprintf関数と同じ働きをするmyfprintf関数
int myfprintf(FILE * stream, const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vfprintf(stream, format, ap);
	va_end(ap);
	return ret;
}
#例:printf関数での変換指定の使い方を参照せよ。

vfscanf関数[編集]

[33]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg);
  • 引数
stream ストリーム
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
vfscanf関数とは、formatが指す書式文字列に従って、streamが指すストリームから入力を、可変個数の実引数のリストへ読み込む関数である。
vfscanf関数は、可変個数の実引数並びをargで置き換えたfscanf関数と等価である。詳しくは#fscanf関数を参照せよ。
vfscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vfscanf関数はva_endマクロを呼び出さない。
#include <stdarg.h>
#include <stdio.h>

//fscanf関数と同じ働きをするmyfscanf関数
int myfscanf(FILE * stream, const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vfscanf(stream, format, ap);
	va_end(ap);
	return ret;
}
#例:scanf関数での変換指定の使い方を参照せよ。

vprintf関数[編集]

[34]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vprintf(const char * restrict format, va_list arg);
  • 引数
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。
  • 機能
vprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、標準出力へ書き込む関数である。
vprintf関数は、可変個数の実引数並びをargで置き換えたprintf関数と等価である。詳しくは#printf関数を参照せよ。
vprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vprintf関数はva_endマクロを呼び出さない。
#include <stdarg.h>
#include <stdio.h>

//printf関数と同じ働きをするmyprintf関数
int myprintf(const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vprintf(format, ap);
	va_end(ap);
	return ret;
}
#例:printf関数での変換指定の使い方を参照せよ。

vscanf関数[編集]

[35]

  • 形式
#include <stdarg.h>
#innlude <stdio.h>
int vscanf(const char * restrict format, va_list arg);
  • 引数
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
vscanf関数とは、formatが指す書式文字列に従って、標準入力を、可変個数の実引数のリストへ読み込む関数である。
vscanf関数は、可変個数の実引数並びをargで置き換えたscanf関数と等価である。詳しくは#scanf関数を参照せよ。
vscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vscanf関数はva_endマクロを呼び出さない。
#include <stdarg.h>
#include <stdio.h>

//scanf関数と同じ働きをするmyscanf関数
int myscanf(const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vscanf(format, ap);
	va_end(ap);
	return ret;
}
#例:scanf関数での変換指定の使い方を参照せよ。

vsnprintf関数[編集]

[36]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg);
  • 引数
s 配列
n 書き込む文字数
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
nが十分に大きい場合に配列に書き込んだはずの文字数。ただし、終端ナル文字は数えない。表現形式エラーが発生した場合、負の値を返す。すなわち、返却値が非負かつn未満の場合、そしてその場合に限り、ナル文字で終了している出力が完全に書き込まれている。
  • 機能
vsnprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、nで指定した書き込む文字数分だけ、sが指す配列へ書き込む関数である。
vsnprintf関数は、可変個数の実引数並びをargで置き換えたsnprintfと等価である。詳しくは#snprintf関数を参照せよ。
vsnprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vsnprintf関数はva_endマクロを呼び出さない。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdarg.h>
#include <stdio.h>

//snprintf関数と同じ働きをするmysnprintf関数
int mysnprintf(char * s, size_t n, const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vsnprintf(s, n, format, ap);
	va_end(ap);
	return ret;
}
#例:printf関数での変換指定の使い方を参照せよ。

vsprintf関数[編集]

[37]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vsprintf(char * restrict s, const char * restrict format, va_list arg);
  • 引数
s 配列
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
配列に書き込まれた文字数。ただし、ナル文字は文字数に数えない。表現形式エラーが発生した場合、負の値。
  • 機能
vsprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、sが指す配列へ書き込む関数である。
vsprintf関数は、可変個数の実引数並びをargで置き換えたsprintfと等価である。詳しくは#sprintf関数を参照せよ。
vsprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vsprintf関数はva_endマクロを呼び出さない。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdarg.h>
#include <stdio.h>

//sprintf関数と同じ働きをするmysprintf関数
int mysprintf(char * s, const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vsprintf(s, format, ap);
	va_end(ap);
	return ret;
}
#例:printf関数での変換指定の使い方を参照せよ。

vsscanf関数[編集]

[38]

  • 形式
#include <stdarg.h>
#include <stdio.h>
int vsscanf(const char * restrict s, const char * restrict format, va_list arg);
  • 引数
s 文字列
format 書式文字列
arg 可変個数の実引数のリスト
  • 返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
  • 機能
vsscanf関数とは、formatが指す書式文字列に従って、sが指す文字列を、可変個数の実引数のリストへ読み込む関数である。
vsscanf関数は、可変個数の実引数並びをargで置き換えたsscanf関数と等価である。詳しくは#sscanf関数を参照せよ。
vsscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。
vsscanf関数はva_endマクロを呼び出さない。
#include <stdarg.h>
#include <stdio.h>

//sscanf関数と同じ働きをするmysscanf関数
int mysscanf(const char * s, const char * format, ...)
{
	va_list ap;
	int ret;
	va_start(ap, format);
	ret=vsscanf(s, format, ap);
	va_end(ap);
	return ret;
}
#例:scanf関数での変換指定の使い方を参照せよ。

文字入出力関数[編集]

[39]

fgetc関数[編集]

[40]

  • 形式
#include <stdio.h>
int fgetc(FILE *stream);
  • 引数
stream 入力ストリーム
  • 返却値
ファイル終了表示子がセットされている場合、又はファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。
  • 機能
fgetc関数とは、streamが指す入力ストリームから、1文字取り込みその値を返却する関数である。
その文字はunsigned char型として取り込み、int型に変換される。
そして、ファイル位置表示子を進める。
#例:テキストファイルの読み書きを参照せよ。

fgets関数[編集]

[41]

  • 形式
#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
  • 引数
s 配列
n 読み取る文字数(ナル文字を含む)
stream ストリーム
  • 返却値
成功した場合、s。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、又は読み取りエラーが発生した場合、空ポインタ。
  • 機能
fgets関数とは、streamが指すストリームから、文字の列を読み取り、sが指す配列に格納する関数である。
読み取る文字の列は改行又はファイルの終わりまでで、読み取る文字数の最大値はn-1である。
最後にナル文字を付ける。
#例:テキストファイルの読み書きを参照せよ。

fputc関数[編集]

[42]

  • 形式
#include <stdio.h>
int fputc(int c, FILE *stream);
  • 引数
c 書き込む文字
stream 出力ストリーム
  • 返却値
書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。
  • 機能
fputc関数とは、streamが指す出力ストリームにcで指定された文字を書き込む関数である。
その文字は、int型からunsigned char型に変換される。
そして、ファイル位置表示子を進める。
#例:テキストファイルの読み書きを参照せよ。

fputs関数[編集]

[43]

  • 形式
#include <stdio.h>
int fputs(const char * restrict s, FILE * restrict stream);
  • 引数
s 文字列
stream ストリーム
  • 返却値
書き込みエラーが発生した場合、EOF。その他の場合、非負の値。
  • 機能
fputs関数とは、streamが指すストリームにsが指す文字列を書き込む関数である。
終端ナル文字の書き込みは行わない。
#例:テキストファイルの読み書きを参照せよ。

getc関数[編集]

[44]

  • 形式
#include <stdio.h>
int getc(FILE *stream);
  • 引数
stream 入力ストリーム
  • 返却値
ファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。
  • 機能
getc関数とは、streamが指す入力ストリームから、1文字取り込みその値を返却する関数である。
getc関数はfgetc関数と等価である。詳しくは#fgetc関数を参照せよ。
#例:テキストファイルの読み書きの「例 fputc、fgetc関数を用いたテキストファイルの読み書き」を参照せよ。

getchar関数[編集]

[45]

  • 形式
#include <stdio.h>
int getchar(void);
  • 引数
なし
  • 返却値
ファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。
  • 機能
getchar関数とは、標準入力から、1文字取り込みその値を返却する関数である。
getchar関数は、実引数としてstdinを指定したgetcと等価である。詳しくは#getc関数を参照せよ。
#include <stdio.h>

int main(void)
{
	int c;
	printf("\n1文字の文字を入力してください:");
	c=getchar();
	printf("\n入力した文字は%cです。", c);
}

gets関数[編集]

[46]

warning!
gets関数は読み取る文字数を指定できないため
バッファオーバーランを防ぐことができません。
また、C11で廃止されました
  • 形式
#include <stdio.h>
char *gets(char *s);
  • 引数
s 配列
  • 返却値
成功した場合、s。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、又は読み取りエラーが発生した場合、空ポインタ。
  • 機能
gets関数とは、標準入力から、文字の列を読み取り、sが指す配列に格納する関数である。
読み取る文字の列は改行又はファイルの終わりまでである。
最後に改行文字の代わりにナル文字を付ける。
//※このプログラムにはバッファオーバーランの可能性がある。
#include <stdio.h>

int main(void)
{
	char str[256];
	printf("\n文字列を入力してください(半角255文字以内):");
	gets(str);
	printf("\n入力した文字列は%sです。", str);
}

putc関数[編集]

[47]

  • 形式
#include <stdio.h>
int putc(int c, FILE *stream);
  • 引数
c 書き込む文字
stream 出力ストリーム
  • 返却値
書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。
  • 機能
putc関数とは、streamが指す出力ストリームにcで指定された文字を書き込む関数である。
putc関数は、fputcと等価である。詳しくは#fputc関数を参照せよ。
#例:テキストファイルの読み書きの「例 fputc、fgetc関数を用いたテキストファイルの読み書き」を参照せよ。

putchar関数[編集]

[48]

  • 形式
#include <stdio.h>
int putchar(int c);
  • 引数
c 書き込む文字
  • 返却値
書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。
  • 機能
putchar関数とは、標準出力にcで指定された文字を書き込む関数である。
putchar関数は、第2実引数としてstdoutを指定したputcと等価である。詳しくは#putc関数を参照せよ。
#include <stdio.h>

int main(void)
{
	int c='a';
	putchar(c);
}

puts関数[編集]

[49]

  • 形式
#include <stdio.h>
int puts(const char *s);
  • 引数
s 文字列
  • 返却値
書き込みエラーが発生した場合、EOF。その他の場合、非負の値。
  • 機能
puts関数とは、標準出力にsが指す文字列を書き込む関数である。
出力の最後に改行文字を追加する。
終端ナル文字の書き込みは行わない。
#include <stdio.h>

int main(void)
{
	char str[]="Hello, world!";
	puts(str);
}

ungetc関数[編集]

[50]

  • 形式
#include <stdio.h>
int ungetc(int c, FILE *stream);
  • 引数
c 文字
stream 入力ストリーム
  • 返却値
変換されて押し戻された文字。操作が失敗した場合、EOF。
  • 機能
ungetc関数とは、cで指定される文字を、streamが指す入力ストリームに押し戻す関数である。
その後の同一ストリームに対する読み取りの際には押し戻された文字を逆順で返す。
押し戻した文字を読み取る前にファイル位置付け関数の呼び出しが成功すると、押し戻していた文字を捨てる。
ungetc関数は、文字列を分解する際に、判定用の文字を一度読み込んだ後、もう一度ストリームに戻してから改めて処理をする場合などに用いる。[51]
#include <stdio.h>

int main(void)
{
	int c;
	printf("\n1文字の文字を入力してください:");
	c=getchar();
	printf("\n入力した文字は%cです。", c);
	ungetc(c, stdin);
	c=getchar();
	printf("\nungetc()で標準入力へ押し戻した文字は%cです。", c);
}

直接入出力関数[編集]

[52]

fread関数[編集]

[53]

  • 形式
#include <stdio.h>
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
  • 引数
ptr 配列
size 大きさ
nmemb 個数
stream ストリーム
  • 返却値
読み取りに成功した要素の個数。その個数は、読み取りエラーが発生した場合、又はファイルの終わりに達した場合、nmembより小さいことがある。
  • 機能
fread関数とは、streamが指すストリームから、最大nmemb個の大きさsizeの要素を、ptrが指す配列に読み取る関数である。
ファイル位置表示子を読み取りに成功した文字数分進める。
エラーが発生した場合、そのストリームのファイル位置表示子の値は不定である。
1つの要素の一部だけが読み取られた時、その値は不定である。
#例:バイナリファイルの読み書きを参照せよ。

fwrite関数[編集]

[54]

  • 形式
#include <stdio.h>
size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
  • 引数
ptr 配列
size 大きさ
nmemb 個数
stream ストリーム
  • 返却値
書き込みに成功した要素の個数。その個数は、書き込みエラーが発生した場合に限り、nmembより小さくなる。
  • 機能
fwrite関数とは、ptrが指す配列から、最大nmemb個の大きさsizeの要素を、streamが指すストリームに書き込む関数である。
ファイル位置表示子を書き込みに成功した文字数分進める。
エラーが発生した場合、そのストリームのファイル位置表示子の値は、不定である。
#例:バイナリファイルの読み書きを参照せよ。

ファイル位置付け関数[編集]

[55]

fgetpos関数[編集]

[56]

  • 形式
#include <stdio.h>
int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
  • 引数
stream ストリーム
pos ストリームの解析状態及びファイル位置情報を格納するオブジェクト
  • 返却値
成功したときは0。失敗したときは0以外で、処理系定義の正の値をerrnoに格納する。
  • 機能
fgetpos関数とは、streamが指すストリームの解析状態及びファイル位置表示子のその時点の値を、posが指すオブジェクトに格納する関数である。
fsetpos関数を用いて、fgetpos関数で取得したファイル位置に、ストリームを再び位置づけることができる。
#例:fgetpos関数とfsetpos関数の使い方を参照せよ。

fseek関数[編集]

[57]

  • 形式
#include <stdio.h>
int fseek(FILE *stream, long int offset, int whence);
  • 引数
stream ストリーム
offset オフセット
whence 位置(SEEK_SET, SEEK_CUR, SEEK_END)
  • 返却値
要求を満足できなかった場合に限り、0以外の値。
  • 機能
fseek関数とは、streamが指すストリームのファイル位置表示子の値を、変更する関数である。
読み取りエラーまたは書き込みエラーが発生した場合、エラー表示子をセットし、fseek関数は失敗する。
バイナリストリームの場合、新しい位置は、whenceが指す位置にoffsetを加えた位置である。
whenceにはSEEK_SET, SEEK_CUR, SEEK_ENDのいずれかを指定し、SEEK_SETはファイルの初め、SEEK_CURはファイル位置表示子のその時点の値、SEEK_ENDはファイルの終わりを意味する。
SEEK_ENDを指定した場合、呼び出しが意味のあるものとしてサポートされるとは限らない。
テキストストリームの場合、offsetに0を指定する、又は同じファイルに結び付けられたストリームに対する以前の成功したftell関数の呼び出しで返された値を指定しなければならない。
後者の場合whenceにはSEEK_SETを指定する。
fseek関数の呼び出しに成功すると、新しい位置を決定した後、ストリームに対するungetc関数の効果をすべて解除し、そのストリームのファイル終了表示子をクリアした上で、ファイル位置表示子を新しい位置に設定する。
fseek関数の呼び出しが成功した後では、更新ストリームに対する次の操作は入力でも出力でもよい。
#例:fseek関数とftell関数の使い方を参照せよ。

fsetpos関数[編集]

[58]

  • 形式
#include <stdio.h>
int fsetpos(FILE *stream, const fpos_t *pos);
  • 引数
stream ストリーム
pos 位置
  • 返却値
成功したとき、0。失敗したとき、0以外の値で、処理系定義の正の値をerrnoに格納する。
  • 機能
fsetpos関数とは、posが指すオブジェクトの値に従って、streamが指すストリームのmbstate_tオブジェクト及びファイル位置表示子を設定する関数である。
fsetpos関数を用いて、fgetpos関数で取得したファイル位置に、ストリームを再び位置づけることができる。
読み取りエラーまたは書き込みエラーが発生した場合、そのストリームに対するエラー表示子が設定され、fsetposは失敗する。
fsetpos関数の呼び出しに成功すると、そのストリームに対するungetc関数の効果をすべて解除し、そのストリームのファイル終了表示子をクリアしたうえで、新しい解析状態を設定し、ファイル位置表示子を新しい位置に設定する。
fsetposの呼び出しが成功した後では、更新ストリームに対する次の操作は入力でも出力でもよい。
#例:fgetpos関数とfsetpos関数の使い方を参照せよ。

ftell関数[編集]

[59]

  • 形式
#include <stdio.h>
long int ftell(FILE *stream);
  • 引数
stream ストリーム
  • 返却値
成功したとき、そのストリームのファイル位置表示子のその時点の値。失敗したとき-1Lで、処理系定義の正の値をerrnoに格納する。
  • 機能
ftell関数とは、streamが指すストリームのファイル位置表示子のその時点の値を得る関数である。
バイナリストリームの場合、その値はファイルの始めからの文字数である。
テキストストリームの場合、そのファイル位置表示子は、ftell関数の呼び出し時の位置にそのストリームのファイル位置表示子を戻すために、fseek関数で使用できる情報を含む。
ただし、この情報の内容は、未規定である。
ftell関数の2回の呼び出し返却値の差は、書き込み文字数又は読み取り文字数という意味を持つとは限らない。
#例:fseek関数とftell関数の使い方を参照せよ。

rewind関数[編集]

[60]

  • 形式
#include <stdio.h>
void rewind(FILE *stream);
  • 引数
stream ストリーム
  • 返却値
なし
  • 機能
rewind関数とは、streamが指すストリームに対応するファイル位置表示子を、そのファイルの始めに位置付ける関数である。
すなわち、そのストリームに対応するエラー表示子をクリアすることを除けば、
(void)fseek(stream, 0L, SEEK_SET)

と等価である。

//showfiletwice.c
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;
	int c;

	if(argc<2){//コマンドライン引数をチェック
		printf("showfiletwice ファイル名\n");
		return 1;
	}
	
	if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンする。
		printf("オープン操作が失敗しました。\n");
		return 1;
	}
	
	//ファイルの内容を表示する。
	while((c=fgetc(fp))!=EOF){
		putchar(c);
	}

	//ファイルの内容を再び表示する。
	rewind(fp);
	putchar('\n');//改行する。
	while((c=fgetc(fp))!=EOF){
		putchar(c);
	}

	fclose(fp);//ファイルをクローズする。
}

エラー処理関数[編集]

[61]

clearerr関数[編集]

[62]

  • 形式
#include <stdio.h>
void clearerr(FILE *stream);
  • 引数
stream ストリーム
  • 返却値
なし
  • 機能
clearerr関数とは、streamが指すストリームのファイル終了表示子及びエラー表示子をクリアする関数である。
#例:clearerr関数とfeof関数の使い方を参照せよ。
#例:clearerr関数とferror関数の使い方を参照せよ。

feof関数[編集]

[63]

  • 形式
#include <stdio.h>
int feof(FILE *stream);
  • 引数
stream ストリーム
  • 返却値
streamのファイル終了表示子がセットされている場合、0以外の値。セットされていない場合、0。
  • 機能
feof関数とは、streamが指すストリームのファイル終了表示子を判定する関数である。
#例:clearerr関数とfeof関数の使い方を参照せよ。

ferror関数[編集]

[64]

  • 形式
#include <stdio.h>
int ferror(FILE *stream);
  • 引数
stream ストリーム
  • 返却値
streamのエラー表示子がセットされている場合、0以外の値。セットされていない場合、0。
  • 機能
ferror関数とは、streamが指すストリームのエラー表示子を判定する関数である。
#例:clearerr関数とferror関数の使い方を参照せよ。

perror関数[編集]

[65]

  • 形式
#include <stdio.h>
void perror(const char *s);
  • 引数
s 文字列
  • 返却値
なし
  • 機能
perror関数とは、整数式errnoのエラー番号に対応するエラーメッセージを生成する、すなわち標準エラーストリームに文字の並びを書き込む関数である。
その文字の並びは、sが空ポインタでなく、かつsが指す文字がナル文字でないならば、
s: エラーメッセージ
であり、それ以外ならば、
エラーメッセージ
である。
errnoとは、一部のライブラリ関数によってエラー発生時に設定される値であり、errno.hで宣言されている。[66]
#include <stdio.h>

int main(void)
{
	FILE *fp;
	char *filename="file_not_existing";
	char *s="エラー";

	if((fp=fopen(filename, "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンする。
		perror(s);
		return 1;
	}

	fclose(fp);//ファイルをクローズする。
}

脚注[編集]

  1. ^ 『JISX3010:2003』p.188「7.19 入出力<stdio.h>」
  2. ^ 『JISX3010:2003』p.190「7.19.2 ストリーム」
  3. ^ 『JISX3010:2003』p.191「7.19.3 ファイル」
  4. ^ バイナリファイルはテキストファイルと比較して、エンディアンやパディングなど環境依存度が高いので注意が必要である。
  5. ^ 『JISX3010:2003』p.188「7.19.1 概説」
  6. ^ 6.0 6.1 『JISX3010:2003』p.183「7.17 共通の定義<stddef.h>」
  7. ^ http://www.c-tipsref.com/words/file_position_indicator.html
  8. ^ 『JISX3010:2003』p.193「7.19.4 ファイルに対する操作」
  9. ^ 『JISX3010:2003』p.193「7.19.4.1 remove関数」
  10. ^ 『JISX3010:2003』p.193「7.19.4.2 rename関数」
  11. ^ 『JISX3010:2003』p.193「7.19.4.3 tmpfile関数」
  12. ^ 『JISX3010:2003』p.194「7.19.4.4 tmpnam関数」
  13. ^ 『JISX3010:2003』p.194「7.19.5 ファイルアクセス関数」
  14. ^ 『JISX3010:2003』p.194「7.19.5.1 fclose関数」
  15. ^ 『JISX3010:2003』p.195「7.19.5.2 fflush関数」
  16. ^ 『JISX3010:2003』p.191「7.19.3 ファイル」
  17. ^ 『JISX3010:2003』p.195「7.19.5.3 fopen関数」
  18. ^ 『JISX3010:2003』p.196「7.19.5.4 freopen関数」
  19. ^ http://www9.plala.or.jp/sgwr-t/lib/freopen.html
  20. ^ 『JISX3010:2003』p.197「7.19.5.5 setbuf関数」
  21. ^ 『JISX3010:2003』p.197「7.19.5.6 setvbuf関数」
  22. ^ 『JISX3010:2003』p.191「7.19.3 ファイル」
  23. ^ 『JISX3010:2003』p.198「7.19.6 書式付き入出力関数」
  24. ^ 『JISX3010:2003』p.198「7.19.6.1 fprintf関数」
  25. ^ 粂井康孝『猫でもわかるC言語プログラミング 第2版』p.34
  26. ^ 『JISX3010:2003』p.204「7.19.6.2 fscanf関数」
  27. ^ 『JISX3010:2003』p.210「7.19.6.3 printf関数」
  28. ^ 『JISX3010:2003』p.210「7.19.6.4 scanf関数」
  29. ^ 『JISX3010:2003』p.210「7.19.6.5 snprintf関数」
  30. ^ 『JISX3010:2003』p.211「7.19.6.6 sprintf関数」
  31. ^ 『JISX3010:2003』p.211「7.19.6.7 sscanf関数」
  32. ^ 『JISX3010:2003』p.211「7.19.6.8 vfprintf関数」
  33. ^ 『JISX3010:2003』p.212「7.19.6.9 vfscanf関数」
  34. ^ 『JISX3010:2003』p.212「7.19.6.10 vprintf関数」
  35. ^ 『JISX3010:2003』p.213「7.19.6.11 vscanf関数」
  36. ^ 『JISX3010:2003』p.213「7.19.6.12 vsnprintf関数」
  37. ^ 『JISX3010:2003』p.213「7.19.6.13 vsprintf関数」
  38. ^ 『JISX3010:2003』p.214「7.19.6.14 vsscanf関数」
  39. ^ 『JISX3010:2003』p.214「7.19.7 文字入出力関数」
  40. ^ 『JISX3010:2003』p.214「7.19.7.1 fgetc関数」
  41. ^ 『JISX3010:2003』p.214「7.19.7.2 fgets関数」
  42. ^ 『JISX3010:2003』p.215「7.19.7.3 fputc関数」
  43. ^ 『JISX3010:2003』p.215「7.19.7.4 fputs関数」
  44. ^ 『JISX3010:2003』p.215「7.19.7.5 getc関数」
  45. ^ 『JISX3010:2003』p.215「7.19.7.6 getchar関数」
  46. ^ 『JISX3010:2003』p.216「7.19.7.7 gets関数」
  47. ^ 『JISX3010:2003』p.216「7.19.7.8 putc関数」
  48. ^ 『JISX3010:2003』p.216「7.19.7.9 putchar関数」
  49. ^ 『JISX3010:2003』p.216「7.19.7.10 puts関数」
  50. ^ 『JISX3010:2003』p.216「7.19.7.11 ungetc関数」
  51. ^ http://simd.jugem.jp/?eid=65
  52. ^ 『JISX3010:2003』p.217「7.19.8 直接入出力関数」
  53. ^ 『JISX3010:2003』p.217「7.19.8.1 fread関数」
  54. ^ 『JISX3010:2003』p.217「7.19.8.2 fwrite関数」
  55. ^ 『JISX3010:2003』p.218「7.19.9 ファイル位置付け関数」
  56. ^ 『JISX3010:2003』p.218「7.19.9.1 fgetpos関数」
  57. ^ 『JISX3010:2003』p.218「7.19.9.2 fseek関数」
  58. ^ 『JISX3010:2003』p.219「7.19.9.3 fsetpos関数」
  59. ^ 『JISX3010:2003』p.219「7.19.9.4 ftell関数」
  60. ^ 『JISX3010:2003』p.219「7.19.9.5 rewind関数」
  61. ^ 『JISX3010:2003』p.219「7.19.10 エラー処理関数」
  62. ^ 『JISX3010:2003』p.219「7.19.10.1 clearerr関数」
  63. ^ 『JISX3010:2003』p.220「7.19.10.2 feof関数」
  64. ^ 『JISX3010:2003』p.220「7.19.10.3 ferror関数」
  65. ^ 『JISX3010:2003』p.220「7.19.10.4 perror関数」
  66. ^ http://www9.plala.or.jp/sgwr-t/lib/perror.html

参考文献[編集]

  • 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正