こんにちは､ お帰りなさい｡
新しいセクションに入りました｡
ここでは､ ファイルの入出力書き込みと読み出しについて説明します｡
今回はテキストファイルを中心に説明しますが､ バイナリファイルについても少し説明します｡
この講義では､ 概要を説明し､ ファイルとは何か､ そして永続的なデータを保存するためにどのような良い使い方があるかをお伝えしたいと思います｡
つまり､ ここまでは､ プログラムがアクセスするデータはすべてメモリ経由なのです｡
私たちは､ 変数や構造体など､ この概念に精通しています｡
プログラムが使用するすべてのデータをメモリから消去します｡
そして､ メモリに保存されるのは､ メモリは本当に高速で､ すぐにアクセスして計算を行うことができるからです｡
フェッチ､ エグゼキューションサイクル､ その他もろもろをやっているわけです｡
ですから､ 範囲はともかく､ 私たちのアプリケーションの範囲や種類が､ メモリしか使わないのであれば､
ある程度限定されてしまうのも事実です｡
プログラムがなくなると記憶もなくなるので､ 非常に制限されることがあるんです｡
本格的なビジネスアプリケーションでは､ メインメモリに収まりきらないほどのデータが必要になります｡
メインメモリも右肩上がりで非常に小さくなっています｡
しかも､ 今は1630〜32ギガバイトという大容量のメモリが手に入るんですよ｡
しかし､ これまで､ 特に組み込み機器では､ RAMがそれほど多くなく､ その結果､ 容量やサイズの関係でアプリケーションが非常に制限されていました｡
メインメモリに格納するのは､ 本当に変数だけでいいんです｡
また､ プログラムがなくなるとメインメモリがなくなるからです｡
再起動をまたいで永続的に保存されるデータを持つことはできません｡
つまり､ ハードディスクドライブなどの外部デバイスに永続的に保存されるデータを処理する能力にすべてがかかっているのですこれらの大きなプログラム｡
だから､ このようにハードディスクに保存する機能を持たせたいのです｡
少し遅いですが､ そこに多くのデータを保存することができますし､ 大きなプログラムでは多くのデータを保存する必要があります｡
C言語では､ 外部デバイスへの書き込み､ 外部デバイスからの読み出しのための多くの関数がヘッダーファイル規格に用意されています｡
ファイルの読み書きのために自分でコードを書く必要はありませんが､ より長い時間データを保存できる機能を持つアプリケーションの優位性がお分かりいただけると思います｡
メリットがいっぱい
データの保存や取り出しに使用する外付けデバイスは､ 通常､ ハードディスクドライブ......ディスクドライブです｡
しかし､ これから説明するヘッダーファイルの機能は､ どの外部記憶装置でも使用することができます｡
だから､ USBドライブでも使えるし､ データを保存する外付け機器でもSSDドライブでも何でも､
すべての例で使える｡
これまでは､ ユーザーが入力したデータはすべて失われていました｡
プログラムの終了後は､ 揮発性メモリと呼ばれる｡
ボルタイムメモリという言葉を聞くと､ メモリが永続的でない､ あるいはデータが永続的でないことを意味する｡
プログラムが終了するか､ マシンが再起動すると消えます｡
そのため､ ユーザーが同じデータでプログラムを実行したい場合､ データが復元されるように毎回入力し直さなければならない｡
とても不便なんです｡
番組制作を制限してしまう｡
そしてまた､ これは揮発性メモリです｡
ファイルに保存したものを､ ハードディスクに保存する場合､ これは永久保存です｡
まだあるんだ｡
マシンを再起動したときや､ プログラムが実行されていないときでもです｡
それは､ ファイルの周りに留まり､ 不揮発性のデータを保存できるため､ 不揮発性メモリと呼ばれ､ 通常はディスクや最近ではソリッドステートドライブやSSDに保存されています｡
それは､ ストレージの名前付きセクションであり､ スタッド標準IOは､ それらのファイルへの読み取りと書き込みができるようにするために､
情報の使用を含むファイルである｡
なぜなら､ 大量のデータを保存することができ､
プログラムが終了したりコンピュータが再起動したりしても､
データが消えてしまう心配がないからです｡
だから､ ファイルを使うのはとてもとても有利になるんです｡
Linux OSやWindows OSの中にあるファイルは､ ある方法で保存されています｡
しかし､ プログラミング言語であるC言語に関しては､ 1バイトずつのバイト列を個別に読み取ることができるだけです｡
これはUnixのファイル構造に対応するものですが､ 必ずしもそうではありません｡
テキストファイルやウィンドウズを読むときには､ サイズについて気にしなければならない余分な文字があるかもしれませんが､
それは単なるバイトの列なので､ 違いが出るだけです｡
そのため､ テキストファイルでバイト数が多い場合でも､ そのバイト数を読み取ることができます｡
そのバイトが何を表しているのかを理解すればいいのです｡
では､ ファイルとはどのようなものか､ そしてC言語を使ってどのようにファイルを読み､ 書き込むかを説明します｡
オフセットの異なるバイトの連続に過ぎない｡
ファイルの始まりはゼロで､ その後は常に異なる位置を見つけることができる｡
4かもしれないし､ 4×10の2かもしれないし､ 100バイト入るかもしれない｡
そして､ ファイルの終わりは通常EOFと呼ばれる特別なマーカーでマークされ､ ファイルがある｡
つまり､ ファイルには始まりと終わりがあり､ 現在の位置があるのです｡
現在位置は､ 先頭から何バイト目に定義されます｡
現在位置は､ すべてのファイル操作が行われる場所です｡
その位置で書くのか､ 読むのか｡
そして､ ファイルの中で現在の位置を好きなところに移動させることができるいくつかの関数についても説明します｡
最後でも､ 最後まで読みたい人は､ 最後まで読んでください｡
ファイルには2種類あります｡
ファイルには､ テキストファイルとバイナリファイルがあります｡
テキストファイルは､ 文字の並びを行として構成して書かれたデータです｡
各行の終わりは改行され､ テキストデータは文字の解釈の仕方によって､ システムによって様々に取得されることがあります｡
ですから､ たとえばDOSのWindowsでは､ すべての行にキャリッジリターンとラインフィードがありますから､ バックスラッシュRとバックスラッシュNということになりますね｡
それで､ データを読むとき､ あるいはデータを書き込むとき､ フォーマットが少し違うので､ これを理解する必要があります｡
でも､ Linuxではバックスラッシュがないんですよね｡
R それで､ テキストデータがどのように書かれているかを理解する必要があります｡ 行で構成されていて､ バイトの連続であるにもかかわらず､
バイナリデータはメモリに表示されるのと全く同じようにバイトの連続として書かれます｡
つまり､ バイナリデータを持つファイルの例としては､ データが挙げられます｡
画像データや音楽エンコードのバイナリファイルなど､ 私たちが作ったファイルは読めません｡
単なるバイトなのでテキストエディタで持ち出そうとすると､ この項ではテキストファイルに集中しますが､
ファイルには好きなデータを書き込むことができます｡
バイトの羅列でメモリ上にどう表示されるか､ テキストとして書くこともできます｡
しかし､ 実際に書き込まれたファイルは､ たとえテキストとして表現されていても､ バイトの羅列で構成されているに過ぎない｡
テキストファイルをエディターで表示できるので､ より読みやすくなります｡
DOSのWindowsやLinuxでは､
データを書き込むときに余分な文字が入ることがあります｡
つまり､ バイナリファイルの12バイトの列は､ 12文字かもしれないし､ 12個の8×8ビットの符号付き整数かもしれないし､
12個の符号なし整数かもしれないのである｡
特にバイナリファイヤーはワトソンを見かけのメモリとして保存しているだけなので､ 厄介です｡
つまり､ バイナリーモードでは､ ファイルの各ビットにアクセスできるのです｡
しかし､ ファイルから何かを読み取るためには､ そこに何がデータとして入っていて､ どのように保存されているかを理解しなければなりません｡
また､ どのようなシステムで動作しているかに依存する場合があります｡
また､ テキストかバイナリかにもよるでしょう｡
ストリームです｡
Cプログラムは､ あなたに代わって3つのファイルを自動的に開きます｡
ストリームはファイルを表すことができますが､ ストリームはより一般的な用語で､ あらゆる種類の入力を表すことができます｡
キーボードを表すこともあれば､ コンソールを表すこともあり､ ファイルを表すこともあれば､ ソケットを表すこともあるわけです｡
ネットワークに慣れている人なら､ ストリームというのはもっと一般的な用語で､ C言語では自動的に開放されるストリームが3つあるんだ｡
一つは標準入力で､ これはシステムの通常の入力装置です｡
通常､ デフォルトではキーボードです｡
スキャンFをするときは標準入力を使っていますが､ 実はスキャンオフを使ってファイルから読み込むこともできるんです｡
入力ストリームを変更した場合､ 多分あなたは､ ファイル標準出力これは通常､ コンソールを介して､
画面上に表示されます｡
標準エラーも画面に出ますが､ 通常はアンパサンド3とか使ってリダイレクトしないと見れません｡
でも､ この3つの出力は､ 私が言ったとおりです｡
標準入力は､ guitarやscan Fが読み込むファイルです｡ 標準出力は､ output usやprint Fが使用します｡
私たちは主にprintfを使ってきました｡
また､ システム上のファイルをリダイレクトして､ 標準入力出力として認識させることもできます｡
これがリダイレクトです｡
これはオペレーティングシステムの概念で､ 標準とは逆に､ データをリダイレクトしたり､ 出力をファイルに送ったり､ 入力をファイルに送ったり､
ファイルから入力を得たりすることができるのです｡
ここで､ 「より小さい」「より大きい」という記号が使えるようになります｡
標準エラー出力の目的は､ エラーメッセージを送るための論理的に区別された場所を提供することです｡
だから､ 画面に表示されていても､ ある種､ 別物なんです｡
そのためには､ 特別なコマンドが必要です｡
ストリームは､ 外部のあらゆるデータのソースやデスティネーションを抽象的に表現したものである｡
そのため､ 例えばファイルよりも汎用性が高い｡
キーボードです｡
ディスク上の表示ファイルのコマンドライン｡
これらはすべて､ ストリームを使った作業の例です｡
C++を勉強し始めたら､ ストリームはもっと重要なものになるでしょう｡
Cライブラリはデータストリームの読み書きのための関数を提供しているので､ ストリームにマッピングされた任意の外部デバイスの読み書きに同じ入出力関数を使用することができます｡
だから､ スキャンFを使ってキーボードから読み取ることができると言ったわけです｡
また､ スキャンFを使ってファイルから読み取ることもできます｡
すべては､ 入力が何であるか､ ストリームがどこを指しているかに依存します｡
そのため､ この機能はとてもとても便利で､ とてもとても柔軟に行うことができます｡
このように､ ファイルとは何か､ なぜ使うのか､ ファイルは永続的なデータであり､ 不揮発性メモリであることなど､
高レベルの概要を説明しました｡
そして､ プログラムのデータを保存する必要があるときに､ 標準のIOヘッダーファイルを使って読み書きすることで､
プログラムがより堅牢に､ より使いやすく､ より柔軟になります｡
そこで次回の講義では､ 標準のIOヘッダに含まれる関数を使って実際に実装してみることにします｡
ありがとうございます｡