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。
ファイル位置付け関数

と等価です。