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

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

ストリーム(stream)とは、物理装置やファイルなどに対する入出力を統一的に扱う概念です。 ストリームには、テキストストリーム(text stream)とバイナリストリーム(binary stream)の2種類があります。
テキストストリームは、行(line)を構成する順序づけた文字の並びです。 テキストとは、メモ帳(notepad.exe)などのテキストエディタでデータを閲覧したときのように、データをテキスト形式で処理します。
バイナリストリームは、内部データをそのまま記録することのできる順序付けされた文字の並びです。 バイナリとは、バイナリエディタでデータを閲覧したときのように、データをバイナリ形式で処理します。

ファイルに対する操作は次のような手順で行う。
プログラム開始時に3つのテキストストリームがあらかじめ定義されています。
入出力<stdio.h>には、一定の手順で呼び出さなければならない関数が多い。 そこで、用途別にいくつかの例を挙げておくこととします。
テキストファイルへ書き込む場合、fopen関数の第二引数に"w"を指定します。 テキストファイルから読み込む場合、fopen関数の第二引数に"r"を指定します。
;fputs、fgets関数を用いたテキストファイルの書き読み:

バイナリファイルへ書き込む場合、fopen関数の第二引数に"wb"を指定します。 バイナリファイルから読み込む場合、fopen関数の第二引数に"rb"を指定します。
リンク:#fopen関数、#fwrite関数、#fclose関数、#fread関数
printf関数などでは、フラグ、最小フィールド幅、精度などを指定することで、様々な書式で文字列を出力することができる。
リンク:#printf関数
scanf関数などでは、代入抑止文字、最大フィールド幅、走査文字集合などを指定することで、様々な書式で文字列を入力することができる。
リンク:#printf関数、#scanf関数
リンク:#printf関数、#scanf関数
リンク:#printf関数、#scanf関数
リンク:#fopen関数、#fgetpos関数、#fprintf関数、#fsetpos関数、#fclose関数
リンク:#fopen関数、#fseek関数、#ftell関数、#fclose関数
リンク:#fopen関数、#feof関数、#fgetc関数、#clearerr関数、#fclose関数
リンク:#fopen関数、#fputc関数、#ferror関数、#clearerr関数、#fclose関数
ヘッダー <stdio.h> にはいくつかのマクロが定義されており、入出力を行うための3つの型と多くの関数が宣言されています。
ISO/IEC 9899:2017 §7.21.4 Operations on files.
ISO/IEC 9899:2017 § 7.21.4.1 The remove function。
ISO/IEC 9899:2017 § 7.21.4.2 The rename function。
ISO/IEC 9899:2017 § 7.21.4.3 The tmpfile function。
プログラムが異常終了した場合、開いている一時ファイルが削除されるかどうかは実装で決まる。ファイルは "wb+"モードで更新用にオープンされる。
ISO/IEC 9899:2017 § 7.21.4.4 The tmpnam function。
ISO/IEC 9899:2017 § 7.21.5 File access functions.
ISO/IEC 9899:2017 § 7.21.5.1 The fclose function。
ISO/IEC 9899:2017 § 7.21.5.2 The fflush function。
ISO/IEC 9899:2017 § 7.21.5.3 The fopen function。
ISO/IEC 9899:2017 § 7.21.5.4 The freopen function。
ISO/IEC 9899:2017 § 7.21.5.5 The setbuf function。
ISO/IEC 9899:2017 § 7.21.5.6 The setvbuf function。


ISO/IEC 9899:2017 § 7.21.6.2 The fscanf function。














fgetc では、Fedora Linuxの場合、上記のようなコードで、エンターキーを押して入力しないといけない。
Linuxにて、エンターキーを押さずに文字列を入力するようにする場合、#include <termios.h> を使って設定を変える方法もあるが、しかしプログラム終了の直前に設定を戻す必要がある(プログラムの実行を終了しても、ターミナルを終了しないかぎり、設定は自動では戻らない)。(Fedora32で2020年8月26日に動作を確認)。
このため、設定を変える前に、現在の設定を保存しなければならない。しかし、とても面倒なので、初心者はあまり、この termios.h の方法には手を出さないほうが良い。もし、間違えて設定を書き換えてしまった場合、いったんターミナルを終了すれば、設定はもとに戻る。
if文と組み合わせる場合は、右辺の文字側の引用符は一重引用符でなければならない。


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


まず、struct termios term; で termios型の構造体を呼び出す。
特別な構造体であり、既に構造体の中身が作成済みになっているので、その設定をこれから書き換えるのだが、書き換え前に標準設定を保存しておく必要があります。(でないと、書き換え後も、ターミナル終了まで、設定が残ってしまう。)
なので、たとえば「 original 」などの名前でtermios構造体をさらに新規作成し、このoriginalに標準設定を残しておく。
だけで、構造体 term の内容が 構造体 original の内容がコピーされる。なお、構造体にかぎらず、一般に構造体は、イコール記号で一括でコピーできる。配列や文字列のコピーだと、等号だけでは一括コピーできずに特殊な操作が必要になるのに、なぜか構造体では等号だけでコピーできるのは不思議に思うかもしれないが、C言語は、そういう奇妙な仕様です。
ターミナルの普段の、エンターキーを押して入力するという入力設定のモード名は「カノニカルモード」というモードです。
一方、エンターキーを押さずに済むモードは、非カノニカルモードである、。
で、termos構造体変数termを、非カノニカルモードにしています。
「ICANON 」だけだとカノニカルモードだが、それの冒頭に否定の意味のチルダ記号「~」がついて、非カノニカルモードになっています。チルダの機能は、ビット列の反転です。
「ECHO」とは、ターミナルに入力文字が表示されるかどうかの設定。本wikiでは説明しやすさの都合で、エコーありにした。 もし、エコー無しにしたければ、チルダをつけて「~ECHO」にすれば、入力文字が表示されなくなる。
&=とは、ビット演算の複合代入演算子で、単に
は
の意味。
なお、
と書かずとも、なぜか
というふうに1行ずつ個別に実行しても同様の設定が行えてしまう。






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

if文で比較するには、引用符は一重引用符を使う必要があります。二重引用符だとコンパイル時にエラーになる。(Fedora 32で確認.)
gets関数はC11で削除されました。
また、gets関数は読取る文字数を指定できないため、 原理的に、バッファオーバーランを防ぐことができません。



ISO/IEC 9899:2017 § 7.21.7.10 The ungetc function。








と等価です。