C言語/ファイル入出力
ファイルのオープン

まず、ファイルを作成したり読書きしたりするための関数を使うには、 ヘッダー<stdio.h>をインクルードする。
ファイルのオープン

Visual Cでは、標準設定ではfopen関数などの標準入出力関数の使用が禁止されており、そのまま上記のコードをコンパイルすると、
ファイルのオープン

のような警告を表示し、コンパイルが完了しない。
ファイルのオープン

このような禁止されている関数の使用を許可するために、#pragma warning(disable:4996)を加え、コンパイラの警告を無効化する(メッセージ通り fopen を fopen_s で置換えても良いが、fopen_s を用意している処理系は稀で、GCCもclangもサポートしておらず、環境を選ばずコンパイルするためには #ifdef _MSC_VER などでプリプロセッサーで条件コンパイルする方法があるが、コードの見通しが悪くなる上バッファサイズの計算のケアなどを見落としがちなので、警告を無効化することを選択した)。
ファイルのオープン

#pragma warning(disable:4996) が、fopenなどの関数の使用を許可するプラグマです。これは、stdafx.h など一連のWindows用ヘッダのインクルードの後に指令する必要がある。
ファイルのオープン

fopen は、モードを "w" で開いた場合、もし対象のファイルが存在しないときは、その名のファイルを新規作成する。
ファイルのオープン

なお、fopenのモードは、
ファイルのオープン

がある。
ファイルのオープン

なお、一般にファイル操作のプログラミングでは、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。
ファイルのオープン

fclose は、ファイルを閉じる関数であり、書き込みモードであればバッファキャッシュをクリアしてから、読み出しモードであればその場でシステムにファイルをディスクリプターを返却(closeシステムコール)する。
ファイルのオープン

読者は、ソースファイルのあるフォルダを確認してみて、"test1.txt"というファイルが作られている事を確認しよう。
読み書き

ファイルを作成したりオープンしただけでは、まだ何も読み込まれないし、何も書き込まれない。
読み書き

ファイルに何かデータを書き込むには、 fprintf という関数を使う。
読み書き

fprintf の冒頭のfは、ファイル関係であることをあらわしている。最後のfは、もともとC言語には「printf」という関数があり、(最後のfは)Format の f。
読み書き

さて、windowsの設定では、ある設定の場合では fopen と同様に fprintf が初期状態では使えない場合があるので、
読み書き

で指令しておく必要の生じる場合もある。
読み書き

インクルードすべきヘッダについては、標準出力のヘッダにあるので、
読み書き

でインクルードすれば充分です。
読み書き

さて fprintf で書き込むデータの形式は、変数でもいいし、書き込みたいテキストを直接指定することもできる。
読み書き

また、もし 変数を書き込む場合なら、変数の型は、文字列型でもいいし、数値型でもいい。
読み書き

ただし、書き込まれた先のテキストファイルでは、書かれたテキストの由来が何かは、もはや不明になる。つまり、書きこまれた先のテキストファイルでは、書かれた文字列は、すべて単なるテキスト文字の集まりとして扱われる。
読み書き

さて、たとえばファイルに「test」とだけ書き込みたいなら、 fprintf(fp, "test \n"); というふうに入力すればいい。
読み書き

何か変数をファイルに書き込みたい場合、たとえば整数型の変数だとして、変数名が「var」なら、それを書き込むには、あらかじめソースコードで
読み書き

のように、どこかで宣言しておく。
読み書き

そのあと、プログラム中にて変数「var」に目的の値を入力させるようにしておく。
読み書き

そのあと、プログラムがコード内でのファイル書き込み実行場所にて
読み書き

のようなコードを実行するように、ソースコードを記述すればいい。
読み書き

ファイル書き込むのできる変数の型は、数値型も文字列型でも可能です。
読み書き

次のコード例として、文字列型の変数をファイルに書き込むコード例を示す。
読み書き

このようにして、ファイルへの出力が出来る。
読み書き

次に、ファイルからの読み取りをする方法を学ぼう。
読み書き

ファイルからの読み取りには、まずfopenの際にモードを"r"にする。(英語で、本や文章などを読むことを read (リード)という。その read リードの頭文字 r のこと。)
読み書き

読み取りの際の関数には fgets や fscanf を使えばいい。
読み書き

fscanf や fgetsは、ファイルから1行ずつ、読み取ることができる。
読み書き

なお、 fscanf や fgets の違いは、
読み書き

です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。 くわしくは、あとの章で説明します。
読み書き

とりあえず、ファイル読み取りの具体例を調べていきましょう。
読み書き

あらかじめ、テキストファイル test1.txt に、なんらかの文字列を書いておこう。
読み書き

一例として、
読み書き

と書いたとする。
読み書き

コード例を示す。
読み書き

このように、最初の1行(aaaaaaaaaaa)だけが読み取りされている。
読み書き

2行目以降も読み取りたい場合には、その行数だけ、下記のように繰り返しfscanfを使う必要がある。
読み書き

fscanf や fgets の違いは、大まかには
読み書き

です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。fgetsのほうが、改行を読み込みます。
読み書き

論より証拠で、実際にコードを実行して比べてみましょう。
読み書き

まず、読み込み対象のテキストファイル test2.txtとして、
読み書き

のように、空白文字(半角スペース)を入れてみましょう。rt と aaaaaaaaaaa のあいだに半角スペースが一文字あります。
読み書き

そしてコードは、(Fedora30 の gccコンパイルで確認)
読み書き

fgetsのほうは
読み書き

このコードでは、printf の%sの後ろには改行文字(\n)をつけていません。なぜなら、fgets ではファイル読み込み時に改行文字も一緒に読み込むからです。
読み書き

です。
読み書き

いっぽう、fscanf のほうは
読み書き

です。
読み書き

このように、fcanf のほうでは、空白文字があるので、最初の1回目のfscanfでは、「rt」までしか読み込みません。
読み書き

しかも改行を読み込まないので、 「rt」と「2行目に書いてある文字列」が続いて
読み書き

と表示されてしまっています。
読み書き

そして、2回目の fscanf で「aaaaaaaaaaa」を読み込んでいます。
CSVファイルの入出力

CSVファイルという、カンマで区切った形式のファイルがある。
CSVファイルの入出力

たとえば、 次のようなデータです。
CSVファイルの入出力

ファイル名「sample.csv」
CSVファイルの入出力

なお、表計算ソフト( libreOffice の Calc など)で、表計算ファイルをCSVファイルに変換することができる。 表計算ソフトのそれぞれのセルにデータを入力したあと、表計算ファイルを「名前をつけて保存」するときに、ファイル形式を選択する欄があるので、その欄でCSV形式を選べばいい。
CSVファイルの入出力

さて、CSVファイルをカンマで区切って一つずつ読み取りたい場合、
CSVファイルの入出力

fscanf関数では %[^ ]という関数を使う。%[^ ]は、そのカッコの中にある文字をみつけるまで文字を読み込む。また、そのカッコ内の文字は保持しない。
CSVファイルの入出力

たとえば %[^,]なら、カンマ記号(,)の手前まで文字を読み込み、カンマ記号じたいは除いて読み込む。
CSVファイルの入出力

なので、%[^,]なら、結果的にカンマ文字を区切り文字として扱うことになる。
CSVファイルの入出力

CSV読み取りファイルのプログラム例は、たとえば次のようなファイルになる。
CSVファイルの入出力

(Fedora30 で確認)
CSVファイルの入出力

実行結果 (Fedora30 で確認)
CSVファイルの入出力

さきほどの章では、説明の都合上、fscanfを使ったが、じつは、fscanfでCSVファイルを作るのは、あまり実用的ではない。
CSVファイルの入出力

なぜなら、まず空白文字(半角スペース)で読み込みを停止してしまうので、半角スペースを含む文字列の読み込みが出来無いからです。
CSVファイルの入出力

なので、CSVの読み取りファイルをC言語で作る場合、fgets関数を作るほうが良い。
CSVファイルの入出力

しかし、fgets には、%[^,] のようなカンマで読み込み中止関数をする都合いい機能が無い。
CSVファイルの入出力

なので、いったんfgetsで、その行の全体を読み込んだ後に、 strtok という別の関数を使うのが良い。
CSVファイルの入出力

strtok 関数とは、指定した文字列の直前までを読み込み機能のある関数なので、この関数でカンマ文字まで読み込むことを関数すればいい。 strtok では、指定した文字列じたいは読み込まない。
CSVファイルの入出力

なお、 strtok 関数を使うためには #include <string.h> が必要です。
CSVファイルの入出力

書式は
CSVファイルの入出力

のようになる。
CSVファイルの入出力

CSVファイルを読み込ませたいなら、区切り文字にしたいのはカンマ記号なので、
CSVファイルの入出力

となる。
CSVファイルの入出力

なお、 strtok の第一引数を「NULL」にすると、前の文字の続きから読み込む。つまり
CSVファイルの入出力

にすると、前の文字の続きから次ぎの区切り文字まで(その行に残りの区切り文字がない場合には行末まで)を読み込む。
CSVファイルの入出力

コードは下記のようになる。
CSVファイルの入出力

(Fedora30 で確認)
CSVファイルの入出力

上記のように、たしかに、読み取った文字列を分解している。
CSVファイルの入出力

さきほどの例では、説明の単純化のため、たったの各行あたり、要素数はたった2個だった。
CSVファイルの入出力

しかし、実際の場合は、もっと要素数が多い。
CSVファイルの入出力

たとえば、
CSVファイルの入出力

のように、各行あたり4個のデータを読み込む場合を考えよう。
CSVファイルの入出力

前の節では、単純化のために配列や構造体やfor文は用いなかったが、実務では用いたほうがイイだろう。
CSVファイルの入出力

各行の最初の項目だけ strncpy(row[0].str, strtok(buffer1, ","), 150); のようにstrtokの第一引数を指定する必要がある。
CSVファイルの入出力

いっぽう、strncpy(row[temp].str, strtok(NULL, ","), 150); のようにstrtokの第一引数がnullなら、strtokは以前の区切り文字から次の区切り文字までを抜き取るだけなので、2番目の項目からはfor文で使いまわしができる。
if文との組み合わせ

fgets関数やstrtok関数などで読み取った文字列をもとに、if文などの条件分岐関数と組み合わせる際、標準C言語のif文では、文字列にはイコール記号== など算術的な記号での比較ができません。
if文との組み合わせ

これはつまり、Cでは、文字列の比較にイコール記号が使えないという事です。
if文との組み合わせ

標準C言語では、文字列どうしの比較をする際、 strcmp という関数を使います。
if文との組み合わせ

strcmpについて詳しくは『C言語/制御文』をお読みください。
Linux の場合

一例として、Fedora28でファイル入出力を実行する場合のコードと実行結果の例を下記にしめします。
Linux の場合

テキストファイルの文字コードはUTF-8です。Fedoraの標準の文字コードのままです。テキストエディタにはGedit(ジーエディット)を用いている。GeditはFedora28で標準に付属してくるテキストエディタです。
Linux の場合

Fedora28の場合、読み取り対象のテキストファイルの文字コードを何に変えても、コマンドプロンプトで正しく表示される。
Linux の場合

なお、Geditの変換可能な文字コードの一覧に「日本語 (CP932)」 というのがあるが、これがマイクロソフト Shift-JIS のことである(つまり マイクロソフト自称「ANSI」)。もし、マイクロソフト自称ANSIとLINUX用テキストファイルを共通化したい場合、 CP932 を選べばいい。
Linux の場合

とはいえ、最近のWindows用テキストエディタでは(Linuxでは標準的に採用されている)UTF-8も表示できるのが一般的なので、特に文字化けなどの起きないかぎり、むりに文字コードを変える必要は無い。
バイナリーファイルの読み書き

C言語のプログラムで、バイナリーファイルの読み書きをしたい場合、
バイナリーファイルの読み書き

fopen の引数で「r」(読み込み)とか「w」(書き込み)とか編集モードの指定がありますが、それに「b」をつけます。つまり「rb」や「wb」などの引数になります。
バイナリーファイルの読み書き

また、書き込む関数には fwrite を使う必要があります。 いっぽう、 fprintf では、テキストファイルに自動的に変換してしまいます。
バイナリーファイルの読み書き

たとえば下記のようになります。
バイナリーファイルの読み書き

書き込みできたか否かを確認するには、バイナリエディタ(あるいは「16進エディタ」などと言われる)で確認してください。
バイナリーファイルの読み書き

0x42 などの冒頭の 0x は16進数であることを表す。バイナリーファイルの読み書きに限らず、一般にC言語で16進数をあつかう場合は、16進数である数に接頭辞 0x をつけて区別する。数値 0~9 までは0x をつけなくても十進数と同じなので省略できる。
バイナリーファイルの読み書き

バイナリエディタで読み込み
バイナリーファイルの読み書き

と書き込まれていることが確認できれば成功です。
バイナリーファイルの読み書き

バイナリファイルの読み取りには fread を使うことがある。
バイナリーファイルの読み書き

いきなりバイナリファイルを読み取るのは初心者には難しいので、まずテキストファイルを読み取る実験をしてみよう。
バイナリーファイルの読み書き

以前に作った test1.txt ファイルを読み取るとしよう。
バイナリーファイルの読み書き

test1.txt
バイナリーファイルの読み書き

コード例
バイナリーファイルの読み書き

では、バイナリーデーターを読み取ろう。
バイナリーファイルの読み書き

コード例