【C言語】標準ライブラリ【stdio.h】 - 入出力
【C言語】
標準ライブラリ【stdio.h】
入出力
入出力 <stdio.h>
ストリームおよびファイルの操作に関する型・マクロ・関数の宣言定義。
FILE | ストリームを制御するためのオブジェクト型(構造体とは限らない) |
fpos_t | ファイルのシーク位置を格納するための型 |
clearerr | ファイル終端表示子およびエラー表示子のクリア |
fclose | ファイルのクローズ |
feof | ファイル終端表示子の判定 |
ferror | エラー表示子の判定 |
fgetc | ストリームからの1文字入力 |
fgetpos | ストリームのファイル位置表示子の参照 |
fgets | ストリームからの1行入力 |
fopen | ファイルのオープン |
fprintf | ストリームへの書式付き出力 |
fputc | ストリームへの1文字出力 |
fputs | ストリームへの1行出力 |
fread | ストリームからの読み込み |
fscanf | ストリームからの書式付き入力 |
fseek | ストリームのファイル位置表示子の変更 |
fsetpos | ストリームのファイル位置表示子の設定 |
ftell | ストリームのファイル位置表示子の参照 |
fwrite | ストリームへの書き込み |
getc | ストリームからの1文字入力 |
getchar | 標準入力からの1文字入力 |
gets | 標準入力からの1行入力(ただし、C11で削除された) |
perror | 標準エラー出力へのエラーメッセージの出力 |
printf | 標準出力への書式付き出力 |
putc | ストリームへの1文字出力 |
putchar | 標準出力への1文字出力 |
puts | 標準出力への1行出力 |
remove | ファイルの削除 |
rename | ファイル名の変更 |
rewind | ストリームの巻き戻し |
scanf | 標準入力からの書式付き入力 |
setbuf | ストリームのバッファ設定 |
setvbuf | ストリームの詳細なバッファ設定 |
sprintf | 文字配列への書式付き出力 |
sscanf | 文字列からの書式付き入力 |
tmpfile | テンポラリファイルをバイナリモードでオープン |
tmpnam | テンポラリファイル名の生成 |
vprintf | 標準出力への書式付き出力( va_list 版) |
vscanf | 標準入力からの書式付き入力( va_list 版) |
入出力<stdio.h> :主にファイルを取り扱う関数
主にファイルを取り扱う関数
C言語では、ディスク以外の周辺機器もファイル扱いできます。
また、規定のファイルポインタとしてこれらを扱うことが出来ます。
- [ 規定のファイルポインタ ]
-
stdin 標準入力(普通はキーボード)
stdout 標準出力(普通はディスプレイ)
stderr 標準エラー出力(普通はディスプレイ)
これらは、リダイレクト等の方法でユーザーが変更することもできますし、
環境によっては、別の機器に関連づけられたり、無効になっていることもあります。
- [ fopen ] : ファイルを開く。
-
関数型 : FILE *fopen(const char *filename, const char *mode);
引数 : ファイル名、モード文字列
戻り値 : 開いたファイルポインタ。失敗した場合はNULL。
機能 : ファイルを開く。
モード : r 読み込み、w 新規、a 追加。b付加でバイナリ、+付加で入出力両用。
ファイルストリームのモード指定
r |
読み込み専用でテキストファイルを開く |
w |
書き込み用にテキストファイルとして開く。ファイルが存在しない場合、新規に作成。すでに存在する場合は、内容がクリアされる。
|
a |
追加書き込み用にテキストファイルとして開く。ファイルが存在しない場合は、新規に作成。すでに存在する場合は、ファイルの末尾から書き込まれるように書き込み位置を設定する。
|
rb |
読み込み専用でバイナリファイルを開く。
|
wb |
書き込み専用でバイナリファイルを開く。ファイルが存在しない場合は、新規に作成。存在する場合は、内容がクリアされる。
|
ab |
追加書き込み用でバイナリファイルを開く。ファイルが存在しない場合は、新規に作成。存在する場合、ファイルの末尾から書き込まれるように書き込み位置を設定する。
|
r+ |
更新用(読み込みと書き込みの両方が可能)でテキストファイルを開く。
|
w+ |
更新用(読み込みと書き込みの両方が可能)でテキストファイルを開く。
ファイルが存在しない場合は、新規作成。
存在する場合は、内容がクリアされる。
|
a+ |
更新用(読み込みと書き込みの両方が可能)でテキストファイルを開く。
ファイルが存在しない場合、新規作成。
存在する場合、ファイルの末尾から追加書き込みされるように、書き込み位置を設定する。
|
r+b |
更新用(読み込みと書き込みの両方が可能)でバイナリファイルを開く。
|
rb+ |
「r+b」と同じ。
|
w+b |
更新用(読み込みと書き込みの両方が可能)でバイナリファイルを開く。
ファイルが存在しない場合は、新規作成。
存在する場合は、クリアされる。
|
wb+ |
「w+b」と同じ。
|
a+b |
更新用(読み込みと書き込みの両方が可能)でバイナリファイルを開く。
ファイルが存在しない場合は、新規作成。
存在する場合は、ファイルの末尾から追加書き込みされるように書き込み位置を設定。
|
ab+ |
「a+b」と同じ。
|
- [ fclose ] : ファイルを閉じる。
-
関数型 : int fclose(FILE *fp);
引数 : ファイルポインタ
戻り値 : 成功した場合は0、失敗したときはEOF
機能 : ファイルを閉じる。
- [ fgetc ] : ファイルから1文字読み出す。
-
関数型 : int fgetc(FILE *fp);
引数 : ファイルポインタ
戻り値 : 読み出した文字。失敗したか終わりに到達した場合はEOF。
機能 : ファイルから1文字読み出す。
- [ getc ] : fgetcと全く同じ。
-
機能 : fgetcと全く同じ。
注意 : マクロになっていることがあるので副作用に注意。
- [ fgets ] : ファイルから1行読み出す。結果に改行を含む。
-
関数型 : char *fgets(char *s, int n, FILE *fp);
引数 : 文字列を格納するバッファ、バッファサイズ、ファイルポインタ
戻り値 : 引数で指定したバッファ。失敗したか終わりに到達した場合はNULL。
機能 : ファイルから1行読み出す。結果に改行を含む。
- [ fputc ] : ファイルに1文字書き込む。
-
関数型 : int fputc(int c, FILE *fp);
引数 : 文字、ファイルポインタ
戻り値 : 出力文字。失敗したときはEOF。
機能 : ファイルに1文字書き込む。
- [ putc ] : fputcと全く同じ。
-
機能 : fputcと全く同じ。
注意 : マクロになっていることがあるので副作用に注意。
- [ fputs ] : ファイルに文字列を書き込む。
-
関数型 : int fputs(const char *s, FILE *fp);
引数 : 文字列、ファイルポインタ
戻り値 : 成功した場合は真、失敗したときはEOF。
機能 : ファイルに文字列を書き込む。
- [ fread ] : ファイルから固定サイズの項目を読み込む。
-
関数型 : size_t fread(void *ptr, size_t size, size_t nelem, FILE *fp);
引数 : 読み込み結果を格納するバッファ、1項目のサイズ、項目数、ファイルポインタ
戻り値 : 読み込んだ項目数。失敗した場合は0。
機能 : ファイルから固定サイズの項目を読み込む。
ファイルから size バイトのデータを n 個読み込み
【書式】
#include
size_t fread(void *buf, size_t size, size_t n, FILE *fp);
【説明】
ファイルfpからsizeバイトのデータをn個読み込み、bufに格納します。ファイル位置指示子を読み込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。
【引数】
void *buf : 読み込みデータ格納先のポインタ
size_t size : 読み込みデータ1項目のバイト長さ
size_t n : 読み込みデータの項目数
FILE *fp : FILEポインタ
【戻り値】
正常時 : 読み込んだデータ個数(バイトではありません)
ファイル終了時及びエラー時 : nより小さな値
【使用例】
#include
#include
int main(int argc,char *argv[])
{
FILE *fp;
int outbf[10] = {1,2,3,4,5,6,7,8,9,10};
int inbuf[10];
int i;
if (argc != 2) {
printf("オープンファイル名を指定してください\n");
exit(EXIT_FAILURE);
}
/* バイナリ書き込み読み込みモードでファイルをオープン */
if((fp = fopen(argv[1], "wb+")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
/* ファイルにデータを書き込み */
fwrite(outbf, sizeof(int), 10, fp);
/* ファイルの先頭に移動 */
fseek(fp, 0L, SEEK_SET);
/* 書き込んだデータを読み込んでみる */
fread(inbuf, sizeof(int), 10, fp);
/* ファイルクローズ */
fclose(fp);
/* 読み込みデータの確認 */
for (i=0; i<10; i++)
printf("%3d",inbuf[i]);
printf("\n");
return 0;
}
【実行結果】
1 2 3 4 5 6 7 8 9 10
【注意】
MS-DOSやWindowsの環境でバイナリモードで書き込んだファイルを、モードに"b"の指定をせずにテキストモードでfopenしfreadすると、'\r'にあたる0x0dのデータを正しく入力しませんので注意が必要です。モードについては、fopenのモードを参照してください。
- [ fwrite ] : ファイルに固定サイズの項目を書き込む。
-
関数型 : size_t fwrite(const void *ptr, size_t size, size_t nelem, FILE *fp);
引数 : 書き込むバッファ、1項目のサイズ、項目数、ファイルポインタ
戻り値 : 書き込んだ項目数。失敗した場合は0。
機能 : ファイルに固定サイズの項目を書き込む。
- [ fprintf ] : ファイルに書式付き文字列を書き込む。
-
関数型 : int fprintf(FILE *fp, const char *format, ...);
引数 : ファイルポインタ、書式付き文字列、可変個の変数
戻り値 : 出力文字数。失敗したときは負の値。
機能 : ファイルに書式付き文字列を書き込む。
int fprintf( FILE * restrict stream, const char * restrict format, ...);
fprintf 関数は format が指す書式文字列に従って,stream が指すストリームへ書き込みを行います.
引数
stream: ストリーム
format: 書式文字列 (詳しくは printf 関数の書式文字列を参照してください)
戻り値
成功した場合: 書き出された文字数
失敗した場合: 負の値
C言語サンプルプログラム
以下に fprintf 関数を使用してファイルに文字列を書き込むサンプルプログラムを以下に示します.
/* header files */
#include
#include
/* main */
int main(void) {
FILE *fp;
char filename[] = "sample.txt";
int count;
/* ファイルオープン */
if ((fp = fopen(filename, "w")) == NULL) {
fprintf(stderr, "ファイルのオープンに失敗しました.\n");
return EXIT_FAILURE;
}
/* 書き込み */
count = fprintf(fp, "Snoopy!\n");
if ( count < 0 ) {
fprintf(stderr, "ファイルの書込みに失敗しました.\n");
fclose(fp);
return EXIT_FAILURE;
}
fprintf(stdout, "%sへ%d文字出力しました.\n", filename, count);
/* ファイルクローズ */
fclose(fp);
return EXIT_SUCCESS;
}
- [ fscanf ] : ファイルから文字列を読み込み指定された形式に変換する。
-
関数型 : int fscanf(FILE *fp, const char *format, ...);
引数 : ファイルポインタ、変換指定文字列、可変個のバッファ
戻り値 : 変換に成功した数。失敗した場合は-1。
機能 : ファイルから文字列を読み込み指定された形式に変換する。
- [ ftell ] : ファイル位置を取得する。
-
関数型 : long ftell(FILE *fp);
引数 : ファイルポインタ
戻り値 : 現在のファイル位置。
機能 : ファイル位置を取得する。
- [ fseek ] : ファイル位置を変更する。
-
関数型 : int fseek(FILE *fp, long offset, int ptrname);
引数 : ファイルポインタ、ファイル位置の移動数、ファイル位置の基準
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : ファイル位置を変更する。
位置 : SEEK_SET 先頭、SEEK_CUR 現在の位置、SEEK_END 終わり。
ファイル位置指示子のセット
【書式】
#include
int fseek(FILE *fp, long offset, int origin);
【説明】
ファイル fp のファイル位置指示子を origin を基準として、offset バイト移動します。
バイナリストリームでは、origin に SEEK_END を指定した場合には意味どおりに動作するかどうかは不定です。
テキストストリームでは、offset が0であるか、または offset が同じストリームに対する以前の ftell関数の呼出しで返された値でなければなりません。後者の場合、origin は SEEK_SETでなければなりません。
fseek の呼び出し成功で、終了指示子をクリアします。
fseek の呼出しの後では、入力、出力どちらの動作も可能です。
【引数】
FILE *fp : FILEポインタ
long offset : 移動バイト数
int origin : SEEK_SET (ファイルの先頭)
SEEK_CUR (ファイルの現在位置)
SEEK_END (ファイルの終端)
【戻り値】
正常時 : =0
異常時 : ≠0
【使用例】
#include
#include
int main(int argc,char *argv[])
{
FILE *fp;
if((fp = fopen(argv[1], "rb")) == NULL ) {
fprintf(stderr,"ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
fseek(fp, 10L, SEEK_SET);
printf("ファイル位置 = %ld\n",ftell(fp));
fseek(fp, -5L, SEEK_CUR);
printf("ファイル位置 = %ld\n",ftell(fp));
fseek(fp, 0L, SEEK_END);
printf("ファイル位置 = %ld\n",ftell(fp));
fseek(fp, 0L, SEEK_SET);
printf("ファイル位置 = %ld\n",ftell(fp));
fclose(fp);
return 0;
}
【実行結果例】
ファイル位置 = 10
ファイル位置 = 5
ファイル位置 = 661
ファイル位置 = 0
- [ fgetpos ] : 現在のファイル位置を格納する。
-
関数型 : int fgetpos(FILE *fp, fpos_t *ptr);
引数 : ファイルポインタ、ファイル位置を格納する変数のポインタ
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : 現在のファイル位置を格納する。
- [ fsetpos ] : ファイル位置を変更する。
-
関数型 : int fsetpos(FILE *fp, const fpos_t *ptr);
引数 : ファイルポインタ、ファイル位置を格納する変数のポインタ
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : ファイル位置を変更する。
- [ feof ] : ファイルが終わりに到達したか調べる。
-
関数型 : int feof(FILE *fp);
引数 : ファイルポインタ
戻り値 : 終わりに到達した場合は真、到達していない場合は偽。
機能 : ファイルが終わりに到達したか調べる。
- [ ferror ] : ファイルにエラーが発生したか調べる。
-
関数型 : int ferror(FILE *fp);
引数 : ファイルポインタ
戻り値 : エラー発生した場合は真、発生していない時は偽。
機能 : ファイルにエラーが発生したか調べる。
- [ clearerr ] : ファイルのエラーの時に回復する。
-
関数型 : void clearerr(FILE *fp);
引数 : ファイルポインタ
機能 : ファイルのエラーの時に回復する。
- [ fflush ] : 出力バッファを強制出力する。
-
関数型 : int fflush(FILE *fp);
引数 : ファイルポインタ
戻り値 : 成功した場合は0、失敗したときは偽。
機能 : 出力バッファを強制出力する。
注意 : コンパイラによっては入力バッファをクリアできる。ただし邪道である。
- [ freopen ] : ファイルポインタの再割り当て。
-
関数型 : FILE *freopen(const char *filename, const char *mode, FILE *fp);
引数 : ファイル名、モード文字列、ファイルポインタ
戻り値 : 引数で指定されたファイルポインタ。失敗した場合はNULL。
機能 : ファイルポインタの再割り当て。
- [ rename ] : ファイルの名前を変更する。
-
関数型 : int rename(const char *oldname, const char *newname);
引数 : 現在のファイル名、新しいファイル名
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : ファイルの名前を変更する。
- [ remove ] : ファイルを削除する。
-
関数型 : int remove(const char *filename);
引数 : ファイル名
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : ファイルを削除する。
- [ getchar ] : 標準入力(キーボード)から1文字読み込む。
-
関数型 : int getchar(void);
戻り値 : 読み出した文字。失敗した場合はEOF。
機能 : 標準入力(キーボード)から1文字読み込む。
- [ putchar ] : 標準出力(ディスプレイ)に1文字書き込む。
-
関数型 : int putchar(char c);
引数 : 文字
戻り値 : 出力文字。失敗したときはEOF。
機能 : 標準出力(ディスプレイ)に1文字書き込む。
- [ gets ] : 標準入力(キーボード)から1行読み出す。結果に改行は含まれない。
-
関数型 : char *gets(char *s);
引数 : 読み込んだ文字列を格納するバッファ
戻り値 : 引数で指定したバッファ。失敗したか終わりに到達した場合はNULL。
機能 : 標準入力(キーボード)から1行読み出す。結果に改行は含まれない。
注意 : バッファオーバーラン(ウイルス侵入)の原因になるので使ってはいけない。
- [ puts ] : 標準出力(ディスプレイ)に1行書き込む。改行されます。
-
関数型 : int puts(const char *s);
引数 : 文字列
戻り値 : 成功した場合は0、失敗したときは0以外。
機能 : 標準出力(ディスプレイ)に1行書き込む。改行されます。
- [ perror ] : 指定した文字列と一緒に直前に発生したエラーを表示する。
-
関数型 : void perror(const char *s);
引数 : 表示する文字列
機能 : 指定した文字列と一緒に直前に発生したエラーを表示する。
- [ printf ] : 標準出力(ディスプレイ)に書式付き文字列を書き込む。
-
関数型 : int printf(const char *format, ...);
引数 : 書式付き文字列、可変個の変数
戻り値 : 出力文字数。失敗したときは-1。
機能 : 標準出力(ディスプレイ)に書式付き文字列を書き込む。
変数の型
宣言例
画面への出力
キーボードからの入力
整数
Int a;
printf("%d",a);
scanf("%d",&a);
実数
Double a;
printf("%f",a);
scanf("%lf",&a);
文字(1文字)
Char a;
printf("%c",a);
scanf("%c",&a);
文字列
Char a[20];
printf("%s",a);
scanf("%s",a);
printf の変換指定文字
変換指定文字(フォーマット指定子=タイプの指定)
意味
%%
%という文字
%d
10進数で出力する
%u
「unsigned int」型の整数
%hi
「short」型の整数
%hu
「unsigned short」型の整数
%ld
「long」型の整数
%lu
「unsigned long」型の整数
%qi, %lld
「long long」型の整数
%qu, %llu
「unsigned long long」型の整数
%x, %X
「unsigned int」型の16進数で文字列化する。
「%x」は小文字。「%X」は大文字を使用する。
%lx, %lX
「unsigned long」型の16進数で文字列化する。
「%lx」は小文字、「%lX」は大文字を使用する。
%qx ,%qX, %llx, %llX
「unsigned long long」型の16進数で文字列化する。
「%qx」「%llx」は小文字、「%qX」「%llX」は大文字を使用する。
%o, %O
「unsigned int」型の8進数で文字列化する。
%f
浮動小数点
%lf
「double」型の浮動小数点
%Lf
「long double」型の浮動小数点
%e
浮動小数点数を指数で出力する。
%c
「unsigned char」型の文字
%C
「wchar_t」型の文字
%s
NULL終端文字列
%S
NULL終端のワイド文字列
printf関数の変換指定子と指定子
printf関数では表示の見栄えを良くするために%と変換指定子との間に次の指定子を入れることができる。
% フラグ フィールド幅 精度 変換指定文字
フラグ
-
左詰めに表示する(省略時には右詰め)
+
符号を付ける(省略時には "-" 符号のみ)
#
数値の表記形式がわかるように表示する
%o のとき
数字の前に "0" を付加する
%x のとき
数字の前に "0x" を付加する
0
0 を詰める
フィールド幅
数値の出力幅を指定します。
int data = 123;
printf("%d\n", data);
123
指定なしのとき
printf("%5d\n", data);
..123
スペース含めて 5文字
printf("%10d\n", data);
.......123
スペース含めて 10文字
printf("%2d\n", data);
123
指定が小さい場合は必要幅
printf("%05d\n", data);
00123
0フラグがあると0を詰める
精度
浮動小数点数の小数点以下の桁数を指定します。
double x = 654.321;
printf("%f\n", x);
654.321000
指定なしのとき
printf("%12f\n", x);
..654.321000
小数点を入れて 12桁(小数点以下の桁は標準値)
printf("%9.2f\n", x);
...654.32
小数点を入れて 9桁(小数点以下 2桁)
- [ scanf ] : 標準入力(キーボード)から文字列を読み込み指定された形式に変換する。
-
関数型 : int scanf(const char *format, ...);
引数 : 変換指定文字列、可変個のバッファ
戻り値 : 変換に成功した数。失敗した場合は-1。
機能 : 標準入力(キーボード)から文字列を読み込み指定された形式に変換する。
注意 : 他の入力関数と一緒に使うと思わぬ動作をすることがある。
キーボードから書式付きで入力します。
scanf() の f は "format"(書式) の f です。
scanf() は printf() と同様に書式指定を行うことにより、「A」のキーを押しても、16進数で入力したり、文字で入力したりというように入力形式を変えることが出来ます。
書き方
scanf( 書式指定文字列, 格納可変個引数 );
(1)書式指定文字列
"" で囲まれた文字列
scanf の変換指定文字
変換指定文字
意味
使われるデータ型
%c
1文字として入力する
文字型
%d
10進数で入力する
整数型
%x
16進数で入力する
%o
8進数で入力する
%f
浮動小数点数を入力する
浮動小数点型
%s
文字列を入力する
文字型配列
※double型の入力は、変換指定子fの前に変換修飾子l(エル)を付加し、"%lf" と表記します。変換修飾子l(エル)を忘れがちですので、注意してください。
※long型の入力は、変換指定子の前に変換修飾子l(エル)を付加し、"%ld" のように表記します。