C言語/標準ライブラリ/stdio.h

出典: フリー教科書『ウィキブックス(Wikibooks)』

ヘッダー <stdio.h> にはいくつかのマクロが定義されており、入出力を行うための3つの型と多くの関数が宣言されています。

概要[編集]

入出力の関数を使用するためには、ヘッダー stdio.h をインクルードする[1][2]

ストリーム[編集]

[3]

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

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

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

ファイル[編集]

[4]

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

  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"を指定します。

;fputs、fgets関数を用いたテキストファイルの書き読み:

#include <stdio.h>

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

    if (fp == NULL) {
      perror("fopen(\"w\")に失敗しました。");
      return 1;
    }
    if (fputs("Hello,World!\n", fp) < 0) {
      perror("fputsに失敗しました");
      return 2;
    }
    fclose(fp);
  }

  {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
      perror("fopen(\"r\")に失敗しました。");
      return 3;
    }
    char str[16] = "";
    if (fgets(str, sizeof str, fp) == NULL) {
      perror("fgetsに失敗しました。");
      return 4;
    }
    puts(str);

    fclose(fp);
  }
}


#include <stdio.h>

int main(void) {
  const char *filename = "example.txt";
  {
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
      perror("fopen(\"w\")に失敗しました。");
      return 1;
    }
    fputc('a', fp);
    fclose(fp);
  }

  {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
      perror("fopen(\"r\")に失敗しました。");
     return 1;
    }
    putchar(fgetc(fp));

    fclose(fp);
  }
}

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

バイナリファイル[5]へ書き込む場合、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文字の文字を入力してください:");
	if (scanf("%*c%c", &c) == EOF) {;	//1文字目を読み飛ばし、2文字目を入力します。
      printf("End of File に達しました。\n");
      return 1; 
    }
	printf("\n入力した2文字目は%cです。", c);
}

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

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

int main(void)
{
	char str[16];
	printf("\n15文字の文字列を入力してください:");
	if (scanf("%15s", str) == EOF) {	//15文字入力します。
      printf("End of File に達しました。\n");
      return 1; 
    }
	printf("\n入力した文字列は%sです。", str);
}

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

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

int main(void)
{
	char str[2]="";
	printf("\nyまたはnを入力してください:");
	if (scanf("%1[yn]", &str) == EOF) {	//ynのみを入力します。
      printf("End of File に達しました。\n");
      return 1; 
    }
	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関数

概説[編集]

ヘッダー <stdio.h> にはいくつかのマクロが定義されており、入出力を行うための3つの型と多くの関数が宣言されています[6]

[編集]

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

マクロ[編集]

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

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

ISO/IEC 9899:2017 §7.21.4 Operations on files[8].

remove関数[編集]

ISO/IEC 9899:2017 § 7.21.4.1 The remove function[9]

形式
#include <stdio.h>
int remove(const char *filename);
機能
remove関数は、filenameが指し示す文字列を名前とするファイルを、その名前ではアクセスできないようにします。その後、その名前でファイルを開こうとしても、新たに作成しない限り失敗します。ファイルが開かれている場合、remove関数の動作は実装によって異なります。
返却値
remove関数は、操作が成功した場合はゼロを、失敗した場合は非ゼロを返します。
#include <stdio.h>

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

rename関数[編集]

ISO/IEC 9899:2017 § 7.21.4.2 The rename function[10]

形式
#include <stdio.h>
int rename(const char *old, const char *new);
機能
rename関数は、oldが指す文字列を名前とするファイルを、newが指す文字列で指定された名前で今後は知られるようにします。old という名前のファイルは、その名前ではアクセスできなくなります。rename 関数が呼び出される前に new が指す文字列で指定されたファイルが存在していた場合、その動作は実装で定義されています。
返却値
rename関数は、操作が成功した場合はゼロを返し、失敗した場合はゼロ以外を返します。 その場合、ファイルが以前に存在していれば、元の名前でアクセスできます。
#include <stdio.h>

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

	printf("リネーム前のファイル名を入力してください。:");
	if (scanf("%256s", oldfilename) == EOF) {
      printf("End of File に達しました。\n");
      return 1; 
    }

	printf("リネーム後のファイル名を入力してください。:");
	if (scanf("%256s", newfilename) == EOF) {
      printf("End of File に達しました。\n");
      return 1; 
    }
	if (rename(oldfilename, newfilename) == 0)
		printf("%sを%sへリネームしました。\n", oldfilename, newfilename);
	else
		perror("リネームに失敗しました。");
}

tmpfile関数[編集]

ISO/IEC 9899:2017 § 7.21.4.3 The tmpfile function[11]

形式
#include <stdio.h>
FILE *tmpfile(void);
機能
tmpfile関数は、他の既存のファイルとは異なる一時的なバイナリファイルを作成し、閉じたときやプログラムの終了時に自動的に削除されます。プログラムが異常終了した場合

プログラムが異常終了した場合、開いている一時ファイルが削除されるかどうかは実装で決まる。ファイルは "wb+"モードで更新用にオープンされる。

返却値
tmpfile 関数は、作成したファイルのストリームへのポインタを返す。ファイルが作成できない場合、tmpfile 関数は NULL ポインタを返す。
#include <stdio.h>

int main(void) {
  FILE *fp = tmpfile();

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

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

  fclose(fp);
}

tmpnam関数[編集]

ISO/IEC 9899:2017 § 7.21.4.4 The tmpnam function[12]

形式
#include <stdio.h>
char *tmpnam(char *s);
機能
tmpnam 関数は、有効なファイル名で、かつ既存のファイル名と同じでない文字列を 生成する。この関数は、少なくともTMP_MAX個の文字列を生成することができますが、それらの文字列はすでに既存のファイルで使用されている可能性があり、戻り値としては適切ではありません
tmpnam 関数は、呼び出すたびに異なる文字列を生成する。
ヌルポインタを引数にしたtmpnam関数の呼び出しは、相互にデータ競合を起こす可能性がある。実装では、どのライブラリ関数もtmpnam関数を呼び出していないかのように動作する。
返却値
もし、適切な文字列が生成できなかった場合、tmpnam関数はnullポインタを返す。それ以外の場合、引数がnullポインタであれば、tmpnam関数はその結果を内部のスタティックオブジェクトに残し、そのオブジェクトへのポインタを返す(以降のtmpnam関数の呼び出しは、同じオブジェクトを変更することができる)。
引数がNULLポインタでない場合は、少なくともL_tmpnam文字の配列を指していると仮定し、tmpnam関数はその結果を配列に書き込み、その値として引数を返す。
#include <stdio.h>

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

	tmpnam(filename);

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

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

ISO/IEC 9899:2017 § 7.21.5 File access functions[13].

fclose関数[編集]

ISO/IEC 9899:2017 § 7.21.5.1 The fclose function[14]

形式
#include <stdio.h>
int fclose(FILE *stream);
機能
fclose関数の呼び出しに成功すると、streamが指すストリームがフラッシュされ、関連するファイルがクローズされます。ストリームに書き込まれていないバッファリングされたデータはホスト環境に配信され、ファイルに書き込まれ、読み込まれていないバッファリングされたデータは破棄されます。呼び出しが成功したかどうかにかかわらず、ストリームはファイルから切り離され、setbuf または setvbuf 関数によって設定されたバッファはストリームから切り離されます (自動的に割り当てられていた場合は解放されます)。
返却値
fclose関数は、ストリームのクローズに成功した場合は0を、エラーが検出された場合はEOFを返します。

fflush関数[編集]

ISO/IEC 9899:2017 § 7.21.5.2 The fflush function[15]

形式
#include <stdio.h>
int fflush(FILE *stream);
機能
streamが出力ストリームまたは最新の操作が入力されていない更新ストリームを指している場合、fflush関数は、そのストリームに対する未書き込みのデータをホスト環境に配信してファイルに書き込ませます。それ以外の場合は、動作は未定義です。
stream が NULL ポインタの場合、fflush 関数は、上記の動作が定義されているすべてのストリームに対してこのフラッシュ動作を実行します。
返却値
fflush関数は、ストリームのエラーインジケータを設定し、書き込みエラーが発生した場合はEOFを、そうでない場合は0を返します。
#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関数[編集]

ISO/IEC 9899:2017 § 7.21.5.3 The fopen function[16]

形式
#include <stdio.h>
FILE *fopen(const char * restrict filename, const char * restrict mode);
機能
filenameが指す名前のファイルを、modeで指定したモードで、オープンします。
modeは次の表のいずれかの文字列を指定します。
次の表以外の文字列の時、動作は未定義です。
fopen関数のmode引数の取り得る値と意味
文字列 モード
r テキストファイルの読み取りモード
w テキストファイルの書き込みモード
x 書き込み用テキストファイルの作成(C11以降)[17]
a テキストファイルの追加書き込みモード
rb バイナリファイルの読み取りモード
wb バイナリファイルの書き込みモード
wbx 書き込み用バイナリファイルの作成(C11以降)[17]
ab バイナリファイルの追加書き込みモード
r+ テキストファイルの更新(読み取り及び書き込み)モード
w+ テキストファイルの更新(書き込み及び読み取り)モード
a+ テキストファイルの更新(読み取りおよび追加書き込み)モード
r+b又はrb+ バイナリファイルの更新(読み取り及び書き込み)モード
w+b又はwb+ バイナリファイルの更新(書き込み及び読み取り)モード
w+bx又はwb+x アップデート用バイナリファイルの作成(C11以降)[17]
a+b又はab+ バイナリファイルの更新(読み取りおよび追加書き込み)モード
C11で追加されたエクスクルーシブモード
C11で追加されたエクスクルーシブモード(排他モード; mode引数の最後の文字が'x')でファイルを開いた場合、ファイルがすでに存在するか、作成できない場合は失敗します。
それ以外の場合は、基礎となるシステムが排他的アクセスをサポートしている範囲で、排他的(非共有)アクセスでファイルが作成されます[17]
オーブン時に、ストリームに対するエラー表示子とファイル終了表示子をクリアします。
返却値
fopen関数は、ストリームを制御するオブジェクトへのポインタを返します。オープン操作に失敗した場合、fopenはNULLポインタを返します。

freopen関数[編集]

ISO/IEC 9899:2017 § 7.21.5.4 The freopen function[18]

形式
#include <stdio.h>
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE restrict stream);
機能
freopen関数は、filenameが指す文字列をファイル名とするファイルを開き、streamが指すストリームをそれに関連付ける。モード引数はfopen関数と同様に使用されます。
filenameがNULLポインタの場合、freopen関数はストリームのモードをmodeで指定されたものに変更しようとし、あたかも現在ストリームに関連付けられているファイルの名前が使われているかのようにします。どのようなモードの変更が許可されるか(もし許可されるなら)、またどのような状況下で許可されるかは実装で定義されています。
freopen関数は、まず、指定されたストリームに関連付けられているすべてのファイルを閉じようとします。ファイルのクローズに失敗しても無視されます。ストリームのエラー・インジケータとファイル終了インジケータはクリアされます。
返却値
freopen関数は、オープン操作に失敗した場合、ヌルポインタを返します。そうでなければ、freopenはstreamの値を返します。
#include <stdio.h>

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

  if (fp == NULL) {
    perror("再オープンに失敗しました。");
    return 1;
  }
  printf("Hello, world!\n");
  fclose(fp);
}

setbuf関数[編集]

ISO/IEC 9899:2017 § 7.21.5.5 The setbuf function[19]

形式
#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>

#if defined(unix)
#include <unistd.h>
#elif defined(_WINDOWS)
#include <windows.h>
#define usleep(t) Sleep(t / 1000)
#else
#error Unknown pratform
#endif

int main(void) {
  printf("START:\n");

  char buf[BUFSIZ];
  setbuf(stdout, buf);
  for (char *p = "Hello, world1!\n"; *p != '\0'; p++) {
    printf("%c", *p);
    usleep(200 * 1000); // 200 * 1000 usec = 0.2 sec
  }
  fflush(stdout);

  setbuf(stdout, NULL);
  for (char *p = "Hello, world2!\n"; *p != '\0'; p++) {
    printf("%c", *p);
    usleep(200 * 1000);
  }
}

setvbuf関数[編集]

ISO/IEC 9899:2017 § 7.21.5.6 The setvbuf function[20]

形式
#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>

#if defined(unix)
#include <unistd.h>
#elif defined(_WINDOWS)
#include <windows.h>
#define usleep(t) Sleep(t / 1000)
#else
#error Unknown pratform
#endif

int main(void) {
  printf("START:\n");

  char buf[BUFSIZ];
  setvbuf(stdout, buf, _IOLBF, sizeof(buf));
  for (char *p = "Hello, world1!\n"; *p != '\0'; p++) {
    printf("%c", *p);
    usleep(200 * 1000); // 200 * 1000 usec = 0.2 sec
  }

  setvbuf(stdout, NULL, _IONBF, 0);
  for (char *p = "Hello, world2!\n"; *p != '\0'; p++) {
    printf("%c", *p);
    usleep(200 * 1000);
  }
  printf("\n");
}

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

[21]

fprintf関数[編集]

[22]

形式
#include <stdio.h>
int fprintf(FILE * restrict stream, const char * restrict format, ...)
引数
stream ストリーム
format 書式文字列
... 任意個数の実引数
返却値
書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。
機能
fprintf関数とは、formatが指す書式文字列に従って、streamが指すストリームへ書き込む関数です。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。書式文字列に含まれる変換指定の部分が、それに対応する後の実引数の値によって置換される。
変換指定は以下のようになる。
%[フラグ][最小フィールド幅][.][精度][長さ修飾子]変換指定子
「[]」は省略可能であることを示す。
フラグ、
'-'
変換結果をフィールド内に左詰めにする(デフォルトで右詰)。
'+'
符号付き変換の結果を常に正符号又は負符号で始める(デフォルトで負の値の場合のみ負符号で始める)。
' ' (space)
符号付き変換の結果の最初の文字が符号でない場合、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 実引数は char 型 C99以降
h 実引数は short 型 全バージョン
l(エル) 実引数は long 型または wchar_t 型または double 型[23] wchar_t についてはC95以降、double についてはC99以降
ll(エルエル) 実引数は long long 型 C99以降
j 実引数は intmax_t 型 C99以降
z 実引数は size_t 型 C99以降
t 実引数は ptrdiff_t 型 C99以降
L 実引数は long double 型 全バージョン

変換指定子[編集]

printfの主な変換指定子
変換指定 意味
%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 整数変数に出力した文字数を格納する
%% '%'を出力する

fscanf関数[編集]

ISO/IEC 9899:2017 § 7.21.6.2 The fscanf function[24]

形式
#include <stdio.h>
int fscanf(FILE * restrict stream, const char * restrict format, ...);
引数
stream ストリーム
format 書式文字列
... 任意個数の実引数
返却値
変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。
機能
fscanf関数とは、formatが指す書式文字列に従って、streamが指すストリームから入力を、任意個数の実引数へ読み込む関数です。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。ストリームからの入力が、書式文字列に含まれる変換指定に従って、それに対応する後の実引数が指す変数に代入される。
変換指定は以下のようになる。
%[*][最大フィールド幅][長さ修飾子]変換指定子
「[]」は省略可能であることを示す。
「*」とは、代入抑止文字です。「*」を指定すると、入力は変換されず、読み飛ばされる。
最大フィールド幅とは、最大フィールド幅(文字で数えて)を指定する正の10進整数です。入力から指定した文字数だけ変換される。

長さ修飾子[編集]

長さ修飾子
修飾子 意味 導入バージョン
hh 実引数は char 型 C99以降
h 実引数は short 型 全バージョン
l(エル) 実引数は long 型または wchar_t 型または double 型[25] wchar_t についてはC95以降、double についてはC99以降
ll(エルエル) 実引数は long long 型 C99以降
j 実引数は intmax_t 型 C99以降
z 実引数は size_t 型 C99以降
t 実引数は ptrdiff_t 型 C99以降
L 実引数は long double 型 全バージョン

変換指定子[編集]

fscanfの主な変換指定子
変換指定 意味
%d 入力を符号付き10進整数に変換する
%i 入力を符号付き整数に変換する
%u 入力を符号無し10進整数に変換する
%o 入力を符号無し8進整数に変換する
%x 入力を符号無し16進整数に変換する
%a, %e, %f, %g 入力を浮動小数点数に変換する
%c 入力を文字に変換する
%s 入力を文字列に変換する
%p 入力をポインタの値に変換する
%n 整数変数に入力した文字数を格納する
%% 1つの%と照合する
%[走査文字の並び] 走査文字の並びに含まれる文字のみを入力し、文字列に変換します。
[の直後に^を指定した場合、走査文字の並びに含まれない文字のみを入力し、文字列に変換します。

printf関数[編集]

[26]

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

scanf関数[編集]

[27]

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

snprintf関数[編集]

[28]

形式
#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関数[編集]

[29]

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関数[編集]

[30]

形式
#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関数[編集]

[31]

形式
#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関数[編集]

[32]

形式
#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関数[編集]

[33]

形式
#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関数[編集]

[34]

形式
#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関数[編集]

[35]

形式
#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関数[編集]

[36]

形式
#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関数[編集]

[37]

形式
#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関数での変換指定の使い方を参照せよ。

文字入出力関数[編集]

[38]

fgetc関数[編集]

[39]

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

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

fgetc では、Fedora Linuxの場合、上記のようなコードで、エンターキーを押して入力しないといけない。

Linuxにて、エンターキーを押さずに文字列を入力するようにする場合、#include <termios.h>[40] を使って設定を変える方法もあるが、しかしプログラム終了の直前に設定を戻す必要がある(プログラムの実行を終了しても、ターミナルを終了しないかぎり、設定は自動では戻らない)。(Fedora32で2020年8月26日に動作を確認)。

このため、設定を変える前に、現在の設定を保存しなければならない。しかし、とても面倒なので、初心者はあまり、この termios.h の方法には手を出さないほうが良い。もし、間違えて設定を書き換えてしまった場合、いったんターミナルを終了すれば、設定はもとに戻る。


if文と組み合わせる場合は、右辺の文字側の引用符は一重引用符でなければならない。

コード例
#include <stdio.h>

int main() {
    while (1) {
        printf("fまたはFを押すと終了します。:");
        int temp = fgetc(stdin);

        if (temp == 'f' || temp == 'F') {
             break;
        }
        printf("\n");
    }
      
    printf("\n");
    return 0;
}


実行例

fまたはFを押すと終了します。:r fまたはFを押すと終了します。:t fまたはFを押すと終了します。:f 終了しています


termios.h は標準入出力ではないが、termios を使った場合のコード例は下記のようになる。

コード例
#include <stdio.h>
#include <termios.h>
#include <unistd.h> // STDIN_FILENO に必要

int main() {
    struct termios term;
    tcgetattr(STDIN_FILENO, &term);

    struct termios original;
    original = term;

    term.c_lflag &= (~ICANON) | ECHO; // 非カノニカルモード。エコーありに設定。
    
    tcsetattr(STDIN_FILENO, TCSANOW, &term);
      
    int temp;
      
    while (1) {      
        temp = fgetc(stdin);
        if (temp == 'f' || temp == 'F') {
             break;
        }
     
    }
      
    printf("\n");
     
    tcsetattr(STDIN_FILENO, TCSANOW, &original); // もとの設定に戻さないと、プログラム終了後も設定が残留します。
            
    return 0;
}


実行例

iuiytf

※ 文字「f」が入力された時点で、(エンターキーを押さずに)自動的にプログラム終了します。


解説

まず、struct termios term; で termios型の構造体を呼び出す。

特別な構造体であり、既に構造体の中身が作成済みになっているので、その設定をこれから書き換えるのだが、書き換え前に標準設定を保存しておく必要があります。(でないと、書き換え後も、ターミナル終了まで、設定が残ってしまう。)

なので、たとえば「 original 」などの名前でtermios構造体をさらに新規作成し、このoriginalに標準設定を残しておく。

   original = term;

だけで、構造体 term の内容が 構造体 original の内容がコピーされる。なお、構造体にかぎらず、一般に構造体は、イコール記号で一括でコピーできる。配列や文字列のコピーだと、等号だけでは一括コピーできずに特殊な操作が必要になるのに、なぜか構造体では等号だけでコピーできるのは不思議に思うかもしれないが、C言語は、そういう奇妙な仕様です。


ターミナルの普段の、エンターキーを押して入力するという入力設定のモード名は「カノニカルモード」というモードです。

一方、エンターキーを押さずに済むモードは、非カノニカルモードである、。

   term.c_lflag &= ~ICANON;

で、termos構造体変数termを、非カノニカルモードにしています。

「ICANON 」だけだとカノニカルモードだが、それの冒頭に否定の意味のチルダ記号「~」がついて、非カノニカルモードになっています。チルダの機能は、ビット列の反転です。

「ECHO」とは、ターミナルに入力文字が表示されるかどうかの設定。本wikiでは説明しやすさの都合で、エコーありにした。 もし、エコー無しにしたければ、チルダをつけて「~ECHO」にすれば、入力文字が表示されなくなる。


&=とは、ビット演算の複合代入演算子で、単に

a &= b 

a = a & b

の意味。

なお、

term.c_lflag &= (~ICANON) | ECHO;

と書かずとも、なぜか

term.c_lflag &= (~ICANON);
term.c_lflag &= ECHO;

というふうに1行ずつ個別に実行しても同様の設定が行えてしまう。


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です。\n", c);
}

実行環境にもよるだろうが、文字を入力したあと、さらにエンターキーを押す必要があります。(Linux の Fedora32でその動作を2020年8月26日に確認。)


コード例
#include <stdio.h>

int main(void)
{
    int c;

    while (1) {
        printf("終了するにはfを1文字入力してください:\n");
        c = getchar();

        if (c == 'f' || c == 'F') { break;}
    }
    
    printf("終了しました\n");
}
動作結果
※ 一例

終了するにはfを1文字入力してください: j 終了するにはfを1文字入力してください: 終了するにはfを1文字入力してください: r 終了するにはfを1文字入力してください: 終了するにはfを1文字入力してください: f 終了しました

if文で比較するには、引用符は一重引用符を使う必要があります。二重引用符だとコンパイル時にエラーになる。(Fedora 32で確認.)

gets関数[編集]

gets関数はC11で削除されました。

また、gets関数は読取る文字数を指定できないため、 原理的に、バッファオーバーランを防ぐことができません。

形式
#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関数[編集]

[46]

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

putchar関数[編集]

[47]

形式
#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関数[編集]

[48]

形式
#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関数[編集]

ISO/IEC 9899:2017 § 7.21.7.10 The ungetc function[49]

形式
#include <stdio.h>
int ungetc(int c, FILE *stream);
機能
ungetc関数は、cで指定された(unsigned charに変換された)文字を、streamが指す入力ストリームに押し戻します。押し戻された文字は、そのストリームに対する後続の読み込みによって、押し戻された順序とは逆の順序で返されます。ファイル位置指定関数(fseek、fsetpos、rewind)を(streamが指すストリームで)正常に呼び出した場合、そのストリームで押し戻された文字は破棄されます。ストリームに対応する外部記憶装置は変更されません。
1文字分のプッシュバックが保証されます。ungetc関数が同一ストリーム上で何度も呼び出され、その間にそのストリームの読み込みやファイルの位置決め操作が行われなかった場合、操作は失敗することがあります。
cの値がマクロEOFの値と等しい場合、操作は失敗し、入力ストリームは変更されません。
ungetc 関数の呼び出しに成功すると、ストリームのファイル終端インジケータがクリアされます。テキストストリームの場合、ungetc関数の呼び出しに成功した後のファイル位置インジケータの値は、押し戻された文字がすべて読み込まれるか、または廃棄されるまで特定できない。バイナリストリームの場合、ungetc関数の呼び出しが成功するたびに、そのファイルポジションインジケーターはデクリメントされます。呼び出し前にその値がゼロだった場合、呼び出し後は不定です。
返却値
ungetc関数は、変換後に押し戻された文字を返し、操作が失敗した場合はEOFを返します。
#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);
}

直接入出力関数[編集]

[50]

fread関数[編集]

[51]

形式
#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関数[編集]

  • N2176 C17 ballot ISO/IEC 9899:2017 §7.21.8.2 The fwrite function[52].
形式
#include <stdio.h>
size_t fwrite(const void * restrict ptr,
size_t size, size_t nmemb,
FILE * restrict stream);
説明
fwrite関数は,ptrが指す配列から,sizeで指定されたサイズのnmemb要素までをstreamが指すストリームに書き込みます。各オブジェクトに対して、サイズコールがfputc関数に行われ、オブジェクトの上に正確に重なっているunsigned charの配列から値を(順に)取得します。ストリームのファイル・ポジション・インジケータ(定義されている場合)は、正常に書き込まれた文字数だけ進みます。エラーが発生した場合、ストリームのファイルポジションインジケータの結果は不定です。
返却値
fwrite関数は、書き込みに成功した要素の数を返しますが、書き込みエラーが発生した場合のみ、nmembよりも小さくなります。sizeまたはnmembが0の場合、fwriteは0を返し、ストリームの状態は変更されません。

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

[53]

fgetpos関数[編集]

[54]

形式
#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関数[編集]

[55]

形式
#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関数[編集]

[56]

形式
#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関数[編集]

[57]

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

rewind関数[編集]

[58]

形式
#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);//ファイルをクローズします。
}

エラー処理関数[編集]

[59]

clearerr関数[編集]

[60]

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

feof関数[編集]

[61]

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

ferror関数[編集]

[62]

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

perror関数[編集]

[63]

形式
#include <stdio.h>
void perror(const char *s);
引数
s 文字列
返却値
なし
機能
perror関数とは、整数式errnoのエラー番号に対応するエラーメッセージを生成する、すなわち標準エラーストリームに文字の並びを書き込む関数です。
その文字の並びは、s が空ポインタでなく、かつ s が指す文字がナル文字でないならば、
{ 仮引数 s の内容 }: エラーメッセージ
であり、それ以外ならば、
エラーメッセージ
です。
errnoは静的な場所に格納されるエラーコードによってエラー状態を報告するマクロです[64]。ヘッダーerrno.h|errno.hで定義されています(宣言ではなくマクロ定義です)。
#include <stdio.h>

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

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

  fclose(fp); //ファイルをクローズします。
  return 0;
}
結果
エラー: No such file or directory

脚注[編集]

  1. ^ 『JISX3010:2003』p.188「7.19 入出力<stdio.h>」
  2. ^ C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p. 296,§ 7.21 Input/output <stdio.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  3. ^ 『JISX3010:2003』p.190「7.19.2 ストリーム」
  4. ^ 『JISX3010:2003』p.191「7.19.3 ファイル」
  5. ^ バイナリファイルはテキストファイルと比較して、エンディアンやパディングなど環境依存度が高いので注意が必要です。
  6. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 217, §7.21.1 Introduction. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  7. ^ 7.0 7.1 N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 211, §7.19 Common definitions <stddef.h>. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  8. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 221, §7.21.4 Operations on files. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  9. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 221, §7.21.4.1 The remove function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  10. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 221, §7.21.4.2 The rename function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  11. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 222, §7.21.4.3 The tmpfile function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  12. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 222, §7.21.4.4 The tmpnam function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  13. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 222, §7.21.5 File access functions. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  14. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 222, §7.21.5.1 The fclose function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  15. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 223, §7.21.5.2 The fflush function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  16. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 223, §7.21.5.3 The fopen function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  17. ^ 17.0 17.1 17.2 17.3 C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. (2011-04-12). pp. 305-306,§ 7.21.5.3 The fopen function. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  18. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 224, §7.21.5.4 The freopen function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  19. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 225, §7.21.5.5 The setbuf function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  20. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 225, §7.21.5.6 The setvbuf function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  21. ^ 『JISX3010:2003』p.198「7.19.6 書式付き入出力関数」
  22. ^ 『JISX3010:2003』p.198「7.19.6.1 fprintf関数」
  23. ^ 可変長引数では「既定の実引数拡張」により、float型の引数はdouble型へと変換されるため、本来はdoubleに対して修飾子を適用する必要はない。
  24. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 231, §7.21.6.2 The fscanf function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  25. ^ 可変長引数では「既定の実引数拡張」により、float型の引数はdouble型へと変換されるため、本来はdoubleに対して修飾子を適用する必要はない。
  26. ^ 『JISX3010:2003』p.210「7.19.6.3 printf関数」
  27. ^ 『JISX3010:2003』p.210「7.19.6.4 scanf関数」
  28. ^ 『JISX3010:2003』p.210「7.19.6.5 snprintf関数」
  29. ^ 『JISX3010:2003』p.211「7.19.6.6 sprintf関数」
  30. ^ 『JISX3010:2003』p.211「7.19.6.7 sscanf関数」
  31. ^ 『JISX3010:2003』p.211「7.19.6.8 vfprintf関数」
  32. ^ 『JISX3010:2003』p.212「7.19.6.9 vfscanf関数」
  33. ^ 『JISX3010:2003』p.212「7.19.6.10 vprintf関数」
  34. ^ 『JISX3010:2003』p.213「7.19.6.11 vscanf関数」
  35. ^ 『JISX3010:2003』p.213「7.19.6.12 vsnprintf関数」
  36. ^ 『JISX3010:2003』p.213「7.19.6.13 vsprintf関数」
  37. ^ 『JISX3010:2003』p.214「7.19.6.14 vsscanf関数」
  38. ^ 『JISX3010:2003』p.214「7.19.7 文字入出力関数」
  39. ^ 『JISX3010:2003』p.214「7.19.7.1 fgetc関数」
  40. ^ termios は標準Cライブラリではなく、POSIXの機能です。
  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.8 putc関数」
  47. ^ 『JISX3010:2003』p.216「7.19.7.9 putchar関数」
  48. ^ 『JISX3010:2003』p.216「7.19.7.10 puts関数」
  49. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 243, §7.21.7.10 The ungetc function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  50. ^ 『JISX3010:2003』p.217「7.19.8 直接入出力関数」
  51. ^ 『JISX3010:2003』p.217「7.19.8.1 fread関数」
  52. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 244, §7.21.8.2 The fwrite function. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  53. ^ 『JISX3010:2003』p.218「7.19.9 ファイル位置付け関数」
  54. ^ 『JISX3010:2003』p.218「7.19.9.1 fgetpos関数」
  55. ^ 『JISX3010:2003』p.218「7.19.9.2 fseek関数」
  56. ^ 『JISX3010:2003』p.219「7.19.9.3 fsetpos関数」
  57. ^ 『JISX3010:2003』p.219「7.19.9.4 ftell関数」
  58. ^ 『JISX3010:2003』p.219「7.19.9.5 rewind関数」
  59. ^ 『JISX3010:2003』p.219「7.19.10 エラー処理関数」
  60. ^ 『JISX3010:2003』p.219「7.19.10.1 clearerr関数」
  61. ^ 『JISX3010:2003』p.220「7.19.10.2 feof関数」
  62. ^ 『JISX3010:2003』p.220「7.19.10.3 ferror関数」
  63. ^ 『JISX3010:2003』p.220「7.19.10.4 perror関数」
  64. ^ N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p. 205, §7.5 Errors. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 

参考文献[編集]