C の知識:stdio.h
「standard input/output」の名前の通り入出力が主です。
入出力
C の入出力はファイルであれ何らかのデバイスであれ、ストリーム(stream)へと抽象化して扱われます。
「stream」とは主に川などの「流れ」を意味しますが、これはファイル等とのデータのやり取りを、1 バイトずつ順に送るパイプの様なものを通してやっているイメージに基づきます。
→
読み込み
ストリームの情報はstdio.hの宣言するFILEという型で保持されます。(実際の受け渡しはポインタFILE *で行われます。)
例えばファイルに対して入出力を行う場合、fopenでファイルを開いてFILE *を取得し、最後にはfcloseでファイルを閉じます。
FILE *fopen(const char * restrict filename, const char * restrict mode); | |
int fclose(FILE *stream); |
一方で OS の提供する標準入力stdin、標準出力stdout、標準エラー出力stderrは、プログラムの実行開始時点から開かれており利用可能です。
ストリームへの出力はfprintfなどの関数で行い、入力はfscanfなどで行います。
/* 出力関数 */ | |
int fprintf(FILE * restrict stream, const char * restrict format, ...); | |
int fputs(const char * restrict s, FILE * restrict stream); | |
int fputc(int c, FILE *stream); | |
size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); | |
/* 入力関数 */ | |
int fscanf(FILE * restrict stream, const char * restrict format, ...); | |
char *fgets(char * restrict s, int n, FILE * restrict stream); | |
int fgetc(FILE *stream); | |
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); |
stdio.hにはprintfなど先頭のfが無い関数もありますが、これは標準入出力を対象としたものです。つまりprintf("hello")はfprintf(stdout, "hello")と同等です7.19.6.3#1。
フォーマット指定
fprintfの三番目(printfの二番目)以降に渡された引数は、format中の%dといった部分へ順番に(文字列へ変換されて)出力されます。
C 言語の仕様上fprintfは引数の型の情報を何も受け取れないので、%に続く文字列によって引数のデータをどう解釈すべきか指示する必要があります。
%の後の文字列は次の要素で構成されます。
フラグ
0 個以上の以下のフラグ。
文字 | 意味 |
---|---|
-符号が付かない場合に半角スペース を表示する | |
+ | 符号(+か-)を常に表示する。 よりも優先される |
0 | フィールドの空きを0で埋める |
- | 左詰めにする(デフォルトは右詰め)。0よりも優先される |
# | 出力を分かりやすくする。十六進数には0xを付ける、浮動小数点数は必ず.を表示するなど |
最小フィールド幅(任意)
非負の整数か*。
*ならば、今の引数は最小フィールド幅を指定するものと解釈され、その次の引数が変換対象となります。例えばprintf("%*d", 5, 1);はprintf("%5d", 1);と同じです。
フィールドの文字数がこの値に満たない場合、デフォルトでは半角スペース で左が埋められます。ただし0フラグがあれば0で、-フラグがあれば右が埋められます。
精度(任意)
.に続く*か整数。.のみだと.0に解釈されます。
.*は上と同様、引数を一つ取って精度を指定する整数に解釈します。
主に浮動小数点数の小数点以下の桁数を指定します。
サイズの指定(任意)
以下の様に解釈を行う型を変更します。
文字 | 型 |
---|---|
hh | char |
h | short |
l | long |
ll | long long |
L | long double |
j | intmax_t |
z | size_t |
t | ptrdiff_t |
変換指定子
以下の何れかの文字により出力形式を指定します。
文字 | デフォルトの型 | 意味 | 出力例 |
---|---|---|---|
d i | int | 十進法の符号付き整数 | 123 |
u o x X | unsigned int | 符号無し整数 oは八進法、xXは十六進法 |
7B |
f F | double | 十進法の浮動小数点数 | 12.300000 |
e E | double | 指数表記の浮動小数点数 | 1.230000E+001 |
g G | double |
fかe(FかE) 桁数に応じて選ばれる |
12.3 |
a A | double | 十六進法の浮動小数点数 | 0XC.4CCCCCCCCCCDP+0 |
c | unsigned char | 文字 | a |
s | char[] | 文字列 | abc |
p | void * | ポインタ。書式は処理系依存 | 0061ff24 |
% | %自身。%%の形でなければならない | % | |
n | int * | ここまでに出力された文字数を引数の ポインタの先へ書き込む |
大文字/小文字は出力に於ける十六進数のa~fや指数表記のeなどに影響します。%xならば7b、%Xならば7Bなど。
ファイル操作
stdio.hはファイルを削除するremove関数や、名前を変更するrename関数も提供しています。
int remove(const char *filename); | |
int rename(const char *old, const char *new); |