SPEAKER:これまでのところ、それは可能性があります あなたのプログラムのほとんどこと ビットはかないされています。 あなたはマリオや貪欲のようなプログラムを実行します。 それは多分よう求め、何かを いくつかの情報をユーザー、 画面にいくつかの出力を印刷し、 しかしその後、あなたのプログラムが終わった時、 そこ証拠は本当にありません それは今までに最初の場所で実行されました。 私は確信して、あなたが残っているかもしれませんが、意味します それは、ターミナルウィンドウで開きます あなたは、画面をクリアする場合は、あります それが存在したことを本当に証拠はありません。 私たちは、格納する手段を持っていません 永続的な情報、情報 それが私たちの後に存在します プログラムが実行を停止しています、 または私達はここまで持っていません。 幸いにもしかし、cがありません 能力を提供してくれる 実装することによってこれを行うには 呼ばれるもの ファイル、基本的な構造 あなたが倍増するファイルを表します あなたがしている場合、お使いのコンピュータをクリックしてください グラフィカルユーザー環境に使​​用されます。 一般的に作業しているとき Cで、私たちは実際にしています で作業することになるだろう ファイルをfiles--へのポインタstars-- 少しを除いて 私たちは夫婦の話をするとき その機能の ファイルポインタを操作します。 あなたは本当に掘っている必要はありません 理解ポインタへの深すぎます 自分自身。 小さな小さなビットがあります 我々は彼らの話をする場所、 しかし、一般的にポインタをファイルし、 ポインタ、相互に関係しながら、 まったく同じものではありません。 今、私はときに何を意味しています 私は、永続​​データを言いますか? 永続データとは何ですか? なぜ我々はそれを気にしますか? こと、例えば、セイ あなたがプログラムを実行しています またはあなたが書き換えられました ゲームだプログラム、 あなたはトラックを維持したいです ユーザーの移動のすべての 多分何かがうまくいかない場合ように、 あなたはこのゲームの後にファイルを確認することができます。 それはときに我々我々が何を意味するかです 永続データについて話しています。 あなたを実行する過程で プログラムは、ファイルが作成されます。 そして、ときにあなたのプログラム 実行を停止しています、 そのファイルがまだシステムに存在します。 そして、私たちはそれを見て、それを調べることができます。 そしてその結果、プログラムは次のように設定されることになります いくつかの永続的なデータを作成しています、 データはプログラムの後に存在します 実行が終了しました。 今動作し、これらの機能のすべて ファイルの作成および操作すると さまざまな方法でそれら 標準io.hに住んでいます、 これは、ヘッダファイルであること あなたはおそらくポンドしてきました かなりの上部に含みます 多くのすべてのプログラムの それは、のいずれかが含まれているため、 私達のための最も便利な機能、 printf関数、またすることができます 標準io.h.に住んでいます だから、含めるポンドにする必要はありません おそらく任意の追加ファイル ファイルポインタを操作するためです。 今すぐすべての単一のファイルポインタ機能、 またはすべての単一のファイルI / O、入力出力 この関数は、として受け付け そのパラメータまたは入力の 除くファイルpointer-- 1、fopenを、これのために あなたがファイルを取得するために使用するものです 最初の場所でのポインタ。 しかし、あなたが開いた後に ファイルと、ファイルポインタを取得し、 あなたがして、それらを渡すことができます 様々な関数の引数 我々はについて話をするつもりです 今日だけでなく、他の多くの あなたがファイルを操作できるようにします。 だから6はかなりあります 共通の基本的なもの 私たちは、今日の話をするつもりだということ。 fopenをとその仲間 関数fcloseは、fgetc関数 その仲間関数fputcは、 とにfreadとそのコンパニオン機能、 fwriteの。 それでは、右のそれに取得してみましょう。 fopen--それが何をするのでしょうか? まあ、それはファイルを開き、 あなたにそれへのファイルポインタを与え、 あなたがしていることを使用できるように、 引数としてポインタをファイル 他のファイルI / O関数のいずれか。 最も重要なこと fopenをして覚えておきます 後にあなたが開いているということです ファイルまたはここのような呼び出しを行いました、 あなたは確認してくださいする必要があります そのあなたが戻ったポインタ nullに等しくありません。 あなたは上のビデオを見ていない場合 ポインタは、これは意味を成さない場合があります。 しかし、もしあなたが試してみて、間接参照 NULLポインタのリコール、 あなたのプログラムはおそらく低下します セグメンテーション[聞こえません]。 私たちは、ことを確認する私たち 正当なポインタのバックを得ました。 時間の大半頂きます バック正当なポインタを得ています それが問題になることはありません。 どのようにして、コールがfopenの作るのですか? これはかなりのようになります。 ファイルのスターはptr-- PTR総称されます pointer--はfopenファイルの名前 我々は、二つのことでファイル名を渡します 操作私達は着手したいと思います。 だから私たちは次のようになります電話を持っている可能性があります this--ファイルスターPTR 1は、fopenのに等しいです FILE1.TXT。 そして、私が選択した操作は、rです。 だから、rはここにあるものだと思いますか? 物事の種類、我々はどのようなものがあります ファイルに行うことができるのでしょうか? だから、rは我々の操作であります 我々は、ファイルを読みたいときに選択します。 だから我々は、基本的に時だろう 我々はこのような呼び出しを行います 自分自身のファイルポインタを取得します 我々は、情報を読み取ることができることなど FILE1.TXTから。 同様に、我々はファイルを開くことができ2.txt 書き込み用と私たちはPTR2を渡すことができ、 私がここで作成したファイルポインタ、 その任意の関数の引数として 情報をファイルに書き込みます。 そして、書き込みと同様に、あります またオプションでは、追加します。 違い 書き込み、追加 あなたがファイルに書き込むときにということで、 あなたは書き込みのためにfopenの呼び出しを行う場合 そのファイルはすでに、それはだ、存在します ファイル全体を上書きする予定。 それは開始する予定です 非常に冒頭に、 すべての情報を削除します それはすでにあります。 あなたは追加のためにそれを開いた場合一方、 それはファイルの末尾に移動します すでにテキストがあるかどう それまたはそれに記載されている情報、 それは、次に起動します そこからの書き込み。 だから、のいずれかを失うことはありません あなたが前にやった情報。 あなたが書いたり、追加したいかどうか ソートの状況によって異なります。 しかし、あなたはおそらく何を知っていますよ 時が来れば右の操作です。 だから、fopenのです。 何fcloseのは? まあ、かなり単に、FCLOSE 単にファイルポインタを受け付けます。 そして、あなたが期待するかもしれないとして、 そのファイルを閉じます。 我々は、ファイルを閉じしたらそして、私たちがすることはできません 、任意の複数のファイルI / O機能を実行します そのファイルには、読み取りまたは書き込み。 我々は再び開く必要があります ために、別の時間を提出 で作業を続行します それは、I / O機能を使用して。 私たちが行っているそうfcloseの手段 このファイルでの作業。 そして、我々が合格するために必要なすべてです ファイルポインタの名前。 だから、カップルのスライド上の前、我々 読書のためのfopenedファイル1ドットテキスト 私たちはそれを割り当てられました PTR1へのポインタをファイル。 今、私たちは私たちがしていることを決定しました そのファイルから読み込み完了です。 私たちはそれをこれ以上行う必要はありません。 私達はちょうどPTR1をfcloseはすることができます。 そして同様に、我々は可能性 他のものをfcloseは。 大丈夫。 だから、開閉ます。 これらは、基本的な2つです 操作を開始します。 今、私たちは、実際にしたいです いくつかの興味深いものを行います、 そして最初の関数は、我々はよ それはfgetc--である致します参照してください。 ファイルには、文字を取得します。 それは一般的にFGETC何 に翻訳するでしょう。 生活の中でその目標はにあります 次の文字を読んで、 または、これはあなたの非常にある場合 fgetc関数の最初の呼び出し 特定のファイルのために、 最初の文字。 しかし、その後、 あなたは、次のいずれかを取得 そのファイルの非常に次の文字、 文字変数に格納します。 私たちがここで行ったように、 チャーchが、fgetc関数に等しいです ファイルポインタの名前を渡します。 繰り返しますが、それは非常にです 覚えてここで重要な 持っているために、その この操作は成功し、 ファイルポインタそのものに違いありません 読み込みのためにオープンされて。 私たちは、ファイルから文字を読み取ることができません 私たちが書き込み用にオープンポインタ。 だから、の一つです 関数fopenの制限、右? 我々は制限する必要があります 自分自身にのみ実行します 1ファイルポインタと一つの操作。 私たちが読みたいと思った場合と 同じファイルからの書き込み、 私たちは別々のオープン2を持っているでしょう 同じfile--へのファイルポインタ 読書のための1つ、書き込みのための1つ。 そこで再び、唯一の理由 私は今、それを持ち出します 私たちは電話をかけるつもりなら理由 fgetc関数に、そのファイルポインタすまんすまん 読み込みのためにオープンされて。 そしてかなり単に、 私たちが行う必要があるすべて ファイルポインタの名前を渡しています。 だから、文字chがfgetc関数PTR1に等しいです。 それが私たちを得るために起こっています 次character-- または、再び、これは最初である場合 私たちはこのコールを行った時、 何の最初character-- ファイルがPTR1によって指されています。 それは、ファイル1ドットのテキストだったことを思い出してください。 それは、その最初の文字を取得します 私たちは、変数CHに格納します。 かなり簡単。 だから我々は3つだけを見てきました 機能とすでに我々 かなりきちんと何かを行うことができます。 だから我々はこの能力を取る場合 文字を取得します 我々ループは、私たちをit-- 文字を取得し続けます オーバーおよびファイルから オーバー、今over-- ひとつひとつを読むことができます ファイルの文字。 そして、我々はすべての文字を印刷する場合 我々はそれを読む直後に、 私たちは今、ファイルから読み込まれていると 画面にその内容を印刷しました。 我々は効果的に連結されてきました 画面上でそのファイル。 そして、それは何です Linuxのコマンドcatはありません。 あなたがファイル名に猫を入力すると、それ 全体の内容を印刷します ターミナルウィンドウでファイルの。 そして、ここではそのようにこの小さなループ、 コー​​ドの3行のみ、 それが効果的に複製します Linuxコマンド猫。 したがって、この構文は、かもしれません 少し奇妙に見えます、 しかし、ここで、ここで何が起こっているかです。 CHは、fgetcに等しいが、ptrがありません それは全体の一口だEOF--に等しく、 しかし、ちょうどそれを打破しましょう それは、構文のは明らかです。 私はそれを統合してきました スペースのために、 それは少しですが、 構文的にトリッキー。 グリーン右にあるので、この部分 今、それは何をしているのですか? まあ、それはちょうど私たちのfgetcを呼び出し、右ですか? 私たちはその前に見てきました。 これは1を取得するです ファイルから文字。 その後、我々はそれを比較します EOFに対する文字。 EOFだ特別な値です 標準io.hで定義されています ファイルの文字の終わりがあります。 したがって、基本的に何が起こるだろう このループは、文字を読み取りますが、 、EOFにそれを比較します ファイルの文字の終わり。 一致しない場合、私たちは持っていません ファイルの終わりに達し、 私たちは、その文字を印刷します。 その後、我々は戻って行きますよ 再びループの始まり。 私たちは、文字、チェックを取得します EOFに対して、というように、それをプリントアウトし、 などというように、 そのようにをループ 我々は、ファイルの最後に到達するまで。 そしてそのポイントによって、 我々は、印刷してます ファイルの内容全体をアウト。 だからもう一度、私たちは見てきました 関数fopen、fcloseは、とのfgetc すでに我々が複製することができます Linuxのターミナルコマンドを実行します。 私が最初に言ったように、 我々はfgetc関数とFPUTCを持っていました、 そして、FPUTCは仲間でした fgetc関数の機能。 そしてそう、ご想像の通り、 それは書き込みと同じです。 それは私達が書くことができます ファイルへの単一の文字。 繰り返しますが、注意点があること、ちょうど それは、fgetcとあったように、ファイル 我々はすまんすまんに書いていることになって 書き込み用または追加用にオープンしました。 我々がしようと、ファイルにFPUTC使用している場合 我々は読み込みのためにオープンしたので、 我々は苦しむことになるだろう 間違いのビット。 しかし、呼び出しは非常に簡単です。 FPUTC資本PTR2、すべて それを行うために起こっていることがあるのです 手紙を書くつもり ファイルに2ドットへ の名前だったテキスト、 我々が開き、割り当てられたファイル PTR2へのポインタ。 だから我々は書くつもりです 大文字のAは2ドットのテキストをファイルに追加します。 そして、私たちは感嘆符を書きます 3ドットのファイルを指します PTR3によって指されたテキスト、。 だからもう一度、ここに非常に簡単。 しかし、今、私たちは別のことを行うことができます。 我々は、この例を持っています 我々はわずかつもりでした 猫を複製することができることについて Linuxのコマンド、プリントアウト1 画面に。 さて、今私たちは能力を持っていること ファイルから文字を読み取ります そして、、ファイルに文字を書き込みます なぜ我々はちょうどそれを代用しないでください FPUTCへの呼び出しでprintfのために呼び出します。 そして今、我々は、CPを複製しましたが、 非常に基本的なLinuxコマンド 我々は、約方法長い話をしたこと 前のLinuxでビデオを命じます。 我々は効果的にしました 右ここことを二重化。 私たちは、文字を読んでいるし、我々はしています 別のファイルにその文字を書き込みます。 一つのファイルからの読み取り、書き込み 他に、何度も 何度も何度も私たちはEOFを打つまで。 私たちは、の最後に持っています 私たちは、からコピーしようとしているファイル。 そして、それによって、私たちはすべて書かれています 我々は、ファイルに必要な文字の 私たちが書いていること。 だから、これはCP、Linuxのコピーコマンドです。 の先頭に このビデオは、私は警告していました 我々は話をすることを ポインタについて少し。 私たちがしているのはここ、具体的です ポインタについて話をするつもり ファイルポインタに加えました。 したがって、この関数は怖いのようなものを探します。 これは、いくつかのパラメータを持っています。 ここで起こっがたくさんあり​​ます。 異なるがたくさんあり​​ます 色とテキスト。 しかし、実際に、それだけです fgetc関数のジェネリック版 それは、私たちはいずれかを取得することができます 情報量。 私たちがしている場合、それは少し非効率的です 文字を一度に1つを得ます、 ファイルを反復処理 1文字ずつ。 それが取得するよりよいではないでしょう 一度に100時または500? さて、関数freadとそのコンパニオン機能 私たちが話しましょう​​fwriteの、 第二に、私たちはちょうどそれをすることができます。 我々は、任意の量を読み取ることができます ファイルからの情報の 私たちはどこかに一時的に保管します。 代わりに単にすることができるという 単一の変数でそれに合わせ、 我々は、配列に格納する必要があるかもしれません。 だから、我々は4で通過します ポインタをfread--の引数 私たちがいる場所へ 情報を保存しようと、 方法大きい情報の各ユニット 、情報のどのように多くの単位になります 我々は取得したい、との どのファイル私たちはそれらを取得したいです。 おそらく最高示します ここでの例です。 それでは、私たちが宣言することとしましょう 10整数の配列。 我々だけで宣言しました 任意スタックARR 10をint型。 だから、非常に簡単です。 今、私たちはあるものの何をやっています frecall我々はint型のサイズを読んでいるされています 時間情報の10バイト。 それはだfour-- int型のサイズがあること Cの整数のサイズ。 それでは、私たちがやっていることは私たちが読んでいるあります 情報の価値が40バイト ファイルからptrが。 そして、我々はそれらを保存しています どこかに40バイト 我々は取っておいた場所 メモリの価値は40バイト。 幸いなことに、我々はすでにによってそれをやりました 右が編曲、その配列を宣言。 それが保持​​することが可能です 10 4バイト単位。 そのように合計では、40を保持することができ バイト情報の価値があります。 そして、我々は今、40バイトを読んでいます ファイルからの情報の、 私たちは、ARRでそれを保存しています。 そのポインタのビデオからリコール そのようなARRとして配列の名前、 本当にただのポインタであります その最初の要素へ。 だから我々が編曲を渡すとき、私たちは ポインタを渡し、実際には、あります。 同様に、私たちはthis--を行うことができます 私たちは必ずしもありません スタック上に私たちのバッファを保存する必要があります。 また、動的に割り当てることができ mallocを使用して、このようなバッファー、。 覚えて、ときに我々 動的にメモリを割り当て、 我々は上でそれを保存しています ヒープ、​​スタックではありません。 しかし、それはまだバッファです。 それでも、この場合には、 情報の640バイトを保持 ダブルは8バイトを占有しますので。 そして、我々は彼らの80のために求めています。 私たちは、スペースを持ちたいです 80倍を保持します。 だから80回8 640バイトの情報です。 そして、関数freadへの呼び出しがあります 情報の640バイトを収集 ファイルからの指します PTRレコードおよびARR2に今それを保存します。 今、私たちはまた、関数freadを扱うことができます ただfgetc関数の呼び出しなどがあります。 この場合、私達はちょうどしようとしています ファイルから1文字を取得します。 そして、我々は必要はありません 文字を格納する配列。 私達はちょうどそれを保存することができます 文字変数。 キャッチは、しかし、ということです 私たちは、変数を持っている場合、 我々はに渡す必要があります その変数のアドレス リコールそのため、 関数freadの最初の引数 場所やメモリへのポインタであります 我々は情報を保存する場所。 再び、名前 配列はポインタです。 だから我々はアンパサンド配列をする必要はありません。 しかし、C、文字c ここでは、配列ではありません。 それはちょうど変数です。 そして、私たちは渡す必要があります 示すために、アンパサンドC それは私たちが望むのアドレスだと この情報の1バイトを格納するために、 、この1文字 我々はPTRから収集しています。 私は通過するだろうFwrite-- このもう少し quickly--はかなりあります 関数freadの、完全に同等 それは書き込みのためだ除き だけではなく、読書の other--のように、私たちはオープン持っていました そして、近く、文字を取得し、 文字を書きます。 今では、任意の取得です 情報の量は、 情報の右の任意の量。 だから前と同じように、我々はできます 10整数の配列を持っています 我々はすでに持っている場所 情報は、おそらく、格納されています。 それはおそらく、コードのいくつかの行でした それは、これら二つの間に行く必要があります 私はARR埋める場所 意味のある何か。 私は10の異なる整数でそれを埋めます。 その代わりに、私は何です やっARRから書いています そして、ARRからの情報を収集します。 そして、私はその情報を取っています そして、ファイルにそれを置きます。 だからではなく、それがからであることの バッファへのファイル、 我々は、今から行っています ファイルへのバッファー。 だから、ちょうど逆です。 直前のようなので、再度、我々はできます また、メモリのヒープチャンクを持っています 我々は動的にしたこと 割り当てられ、そこから読み込みます そして、ファイルにそれを書き込みます。 そして、我々はまた、単一の変数を持っています 1バイトを保持することができます そのような文字として、情報の。 しかし、再び、我々はで渡す必要があります その変数のアドレス 我々はそれから読みたいとき。 だから我々は情報を書き込むことができます そのアドレスで私たちを見つけます ファイルポインタ、PTRへ。 他の多くがあります 大きなファイルI / O機能 それは他にも色々なことを行います ものは、私たちは今日の話をしました。 もののカップル あなたは便利かもしれません 関数fgetsとfputsは、 同等です fgetc関数とFPUTCのが、読書のための ファイルから単一の文字列。 単一の文字の代わりに、 それは、文字列全体を読み込みます。 基本的には可能に関数fprintf、 あなたはファイルに書き込むのprintfを使用しています。 だから、あなたが行うことができます同じように 使用して変数置換 プレースホルダパーセントiと printf関数で%のD、およびように、 あなたは、同様に取ることができます printfの文字列と印刷何か ファイルにそのような。 あなたはDVDプレーヤーを持っている場合fseek-- 私は通常here--使用アナロジーがあります ソートのあなたを使用してのようなものです 巻き戻し、早送り 映画の周りを移動するためのボタン。 同様に、ファイルを移動することができます。 内部のものの一つ そのファイル構造 あなたは指標であるため、そのCが作成されます あなたはファイルのどこにいるの。 あなたは非常にあり バイトはゼロで、始まりますか? あなたがバイト100にあり、 バイト千、というように? あなたは、任意に移動するためにfseek関数を使用することができます 前方または後方にそのインジケータ。 そして再び、FTELL DVDプレーヤーと同様に、 伝え少し時計のようなものです あなたどのように多くの分と秒あなた 特定の映画にしています。 同様に、ftellはどのように説明します あなたがファイルにあるバイト数。 FEOFは異なるバージョンです あなたがきたかどうかを検出します ファイルの終わりに到達しました。 ferror関数であります あなたが使用することができます 何かが持っているかどうかを検出します ファイルでの作業間違って。 再び、これはただであります 表面を傷つけ。 もっとたくさんのファイルは、I / Oまだあります 標準io.h.の関数 しかし、これはおそらくあなたを取得します ファイルポインタで働き始めました。 私はダグロイドです。 これはCS50です。