Cスタイルの入出力ストリーム

ストリーム関連の関数
関数  
fopen ストリームを開く
fclose ストリームを閉じる
feof ストリームのファイルの終わりを検査する
ferror ストリームのエラーを検査する
   
ストリーム入出力 | MSDN

ストリームのオープン

ファイルのオープン

ストリームからの入力

関数 書式 入力元  
getchar
int getchar();
標準ストリーム 1文字
getc ※1
int getc(FILE *stream);
指定のストリーム 1文字
gets
char *gets(char *buffer);
標準ストリーム 1行
※1 getcはfgetcのマクロ

ファイルからの読み込み

scanf

標準入力ストリーム (stdin) から、書式付きのデータを読み取れます。

int   scanf  (const char    *format                  [, argument]... );
int  _scanf_l(const char    *format, locale_t locale [, argument]... );
int  wscanf  (const wchar_t *format                  [, argument]... );
int _wscanf_l(const wchar_t *format, locale_t locale [, argument]... );
scanf、_scanf_l、wscanf、_wscanf_l | MSDN

ストリームへの出力

ファイルへの書き込み

printf

書式付きのデータを、標準出力ストリーム (stdout) へ書き込めます。

int   printf  ( const char    *format                  [, argument]... );
int  _printf_l( const char    *format, locale_t locale [, argument]... );

int  wprintf  ( const wchar_t *format                  [, argument]... );
int _wprintf_l( const wchar_t *format, locale_t locale [, argument]... );
printf、_printf_l、wprintf、_wprintf_l | MSDN

似た関数にfprintfとsprintfがありますが、これらはそれぞれ次のように異なります。

  • fprintf … 任意のストリームへ出力
  • sprintf … 文字列へ出力
int  fprintf( FILE    *stream,               const char    *format [, argument]... );
int fwprintf( FILE    *stream,               const wchar_t *format [, argument]... );

int  sprintf( char    *buffer,               const char    *format [, argument]... );
int swprintf( wchar_t *buffer, size_t count, const wchar_t *format [, argument]... );
fprintf、_fprintf_l、fwprintf、_fwprintf_l | MSDN sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l | MSDN

ロケールを指定できる次の形式もあります。

int  _fprintf_l( FILE    *stream,               const char    *format, locale_t locale [, argument ]... );
int _fwprintf_l( FILE    *stream,               const wchar_t *format, locale_t locale [, argument ]... );

int  _sprintf_l( char    *buffer,               const char    *format, locale_t locale [, argument ]... );
int _swprintf_l( wchar_t *buffer, size_t count, const wchar_t *format, locale_t locale [, argument ]... );

セキュリティが強化されたバージョン

それぞれの関数には、接尾辞として_sが付加されたバージョンが存在します。

int  printf_s(                                    const char *format [, argument ]... );
int fprintf_s( FILE *stream,                      const char *format [, argument ]... );
int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument ]... );

安全ではない関数との違いは、書式指定文字列の確認方法にあります。安全ではない方はnullかどうかのみですが、安全な方はその有効性まで確認します。またsprintf_sについては出力バッファのサイズを文字数で指定でき、それが不足するときには空文字列に設定されます。

書式指定構文 (Format specification syntax)

%[flags] [width] [.precision] [{h | l | ll | w | I | I32 | I64}] type
  意味 指定する値
flags フラグ -+、空白、#0
width 最小フィールド幅 *10進定数
precision 精度
  • 整数 … 最小桁数
  • 浮動層数点数 … 小数点以下の桁数
  • 文字列 … 最大文字数
.*.10進定数
  省略可能な変換指定子 h、l、llなど
type 変換指定子 d、i、o、u、x、X、fなど
書式指定構文: printf 関数と wprintf 関数 | MSDN
printf("%+d\n",  123);   // +123
printf("%+d\n", -123);   // -123
printf("% d\n",  123);   //  123
printf("% d\n", -123);   // -123

printf("%d\n",   12345); // 12345
printf("%2d\n",  12345); // 12345
printf("%8d\n",  12345); //    12345
printf("%08d\n", 12345); // 00012345
printf("%f\n",    12.3456); // 12.345600
printf("%5.2f\n", 12.3456); // 12.35
printf("%5.8f\n", 12.3456); // 12.34560000
printf("%8.2f\n", 12.3456); //    12.35

printf("%.5f\n",  12.3456); // 12.34560
printf("%8f\n",   12.3456); // 12.345600
printf("%s\n",      "ABCDE"); // ABCDE
printf("%.3s\n",    "ABCDE"); // ABC
printf("%.*s\n", 3, "ABCDE"); // ABC
変換指定子 (conversion specifier)
文字 対象  
c 文字 (int型)
  • printfでは、マルチバイト文字
  • wprintfでは、ワイド文字
C 文字 (int型)
  • printfでは、ワイド文字
  • wprintfでは、マルチバイト文字
s 文字列 (文字型の配列) nullが出現するまで
d、i 整数 (int型) 符号付き10進数
u 整数 (unsigned int型) 符号なし10進数
x 整数 (unsigned int型) 符号なし16進数 (小文字)
X 整数 (unsigned int型) 符号なし16進数 (大文字)
f 浮動小数点数 (double型) [-]dddd.dddd
e 浮動小数点数 (double型) [-]d.dddd e[符号]dd[d]
E 浮動小数点数 (double型) [-]d.dddd E[符号]dd[d]
   
printf 関数の型フィールド文字 | MSDN

ロケール (Locale)

setlocale()

標準ストリームのポインタ

ポインタ  
stdin 標準入力
stdout 標準出力
stderr 標準エラー
stdin、stdout、stderr | MSDN
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);

#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
ucrt\corecrt_wstdio.h

参考

参考書

Microsoft Learnから検索