Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> ファイルの終わりについて

ファイルの終わりについて

  

(1)ファイルの終わりを判断するファイルの終わりを示すEOFがファイル内にあると考える人はほとんどいますが、実際にはこの見解は間違っており、ファイルに含まれるデータには何もありません。ファイルの終わりgetcの場合、ファイルから読み取れない場合は、整数-1を返します(EOFと呼ばれます)EOFを返すのは2つのケースにすぎません、1つはファイルが読み取られたこと、もう1つはファイルです。

(2)なぜfeofが必要なのですか?FILE * fp; fpは非常に複雑なデータ構造を指しています、feofはファイルがこの構造のフラグで終わっているかどうかを判断するために使用されます。ファイルがfgetcで読み込まれた場合、最後の文字が読み込まれたときにfpのEOFフラグが開かないので、feofを使用すると、ファイルが完成していないという結論になります。

fgetc戻る-1、まだ読み取りエラーの可能性があるため、ファイルが終了したことを確認することはできません!この時点で、feofとferorが必要です。

(3)Ctrl + Dについて

getchar()戻り値は通常文字ですが、EOFを返す負の値も可能です。

ここで強調する点は、getchar関数は通常端末によって入力された文字を返すということですこれらの文字システムの対応するASCII値は負ではありません。したがって、多くの場合、次のように2行のコードを記述します。char c; c = getchar();

これは問題を引き起こす可能性があります。 getchar関数はCtrl + D(Linux)またはファイルの終わりEOFに遭遇するとEOFを返すので、getchar()はEOFを返します。これは通常関数ライブラリで-1として定義されています。したがって、この場合、getchar関数は負の値を返し、負の値をchar変数に代入することは正しくありません。定義された変数にgetchar関数から返される可能性のあるすべての値が含まれるようにするには、正しい定義は次のようになります(この問題はK&A RCで特に言及されています)。int c; c = getchar();

第二に、EOFの要約の2つのポイント(主に普通の端末のEOFを参照)1.ファイルの終わりとしてのEOF:

EOFはファイルの終わりですが、いかなる状況下でも、Ctrl +を押してはいけませんD( Windows - Ctrl + Z)は、以下の条件下でのみファイルの終わりとしてファイルの終わり機能を実行できます。 (1)最初の文字を入力するときにgetcahr関数を実行すると直接Ctrl + Dを押すことができ、getchar()から飛び出してプログラムの他の部分を実行することができます。次に、Ctrl + Dと入力します(3)前に文字入力があり、それが改行文字ではない場合は、Ctrl + Dを2回入力する必要があります。その後、Ctrl + Dの2番目の入力がファイルの終わりとして機能します。最初のCtrl + Dの役割については以下で紹介します。実際、3つのケースすべてをgetchar()が新しい入力を要求したときだけ要約することができます。Ctrl+ Dを直接入力することはファイルの終わりに相当します。

2. EOFを行末記号として使用した場合、Ctrl + Dキーを押してもgetchar()は終了しませんが、getchar()のみが次の入力ラウンドを促します。

この状況は、主にgetchar()に新しい入力行を作成したときに発生します(多くの文字を入力すると(改行を含めることはできません))、Ctrl + Dを直接入力できます。ターミネータは、改行文字に相当するものだけで、現在の入力を終了します。上記のコードセグメントを例にとると、実行中にabcを入力してからCtrl + Dを押すと、プログラムの出力は次のようになります:abcabc

注:abcの最初のグループは端末から入力され、Ctrl + Dを入力します。 2番目のabcが出力され、カーソルは2番目の文字セットのcの後ろで停止し、その後新しい入力を行うことができます。このとき、もう一度Ctrl + Dを入力すると、ファイル終了文字と終了getchar()の役割を果たします。 abcを入力してから改行を入力すると、端末に次のように表示されます。abc //1行目、キャリッジabc //2行目//3行目

ここで最初の動作端末入力、2番目の端末入力は端末出力として機能し、カーソルは3行目で停止し、新しい端末入力を待ちます。ここから、Ctrl + Dと改行がそれぞれ行末として使用されている場合の出力結果も確認できます。端末に文字入力がある場合、Ctrl + Dによって生成されたEOFは行の入力を終了するのと同じことになり、端末に文字入力がない場合またはgetcharと言える場合はgetchar()への入力が新たに繰り返されます。 ()新しい入力を読み込むときは、Ctrl + Dを押すと、この時点で生成されたEOFがファイルの終わりに相当し、プログラムはgetchar()の実行を終了します。 [補足]本稿後半のEOFの要約部分は、1行モードの端末ドライバに適用されます。つまり、getchar()とputchar()は実際には一度に1文字ずつ実行されます。ただし、端末ドライバは1行モードであり、その入力は「終了」または「EOF」になったときにのみ終了するため、端末で取得される出力も回線上にあります。あなたが文字を読むために端末の終わりを達成したい場合は、次のプログラムは実装方法です(「Cエキスパートプログラミング」を参照、わずかに変更)/* GodbachCUブログによる編集:http://blog.chinaunix.net/u /33048 /* /#include< stdio.h>#include< stdlib.h>

intmain(void){int c; /*ターミナルドライバは通常の1行モードです* /system(" Stty raw";);

/*現在の端末ドライバは一度に1文字モードになります* /c = getchar(); putchar();

/*端末ドライバは一度に1行ずつ戻ります。モード* /system(" sttycook");

return 0;}

プログラムをコンパイルして実行し、文字が入力されるとその文字が直接使用され、プログラムは終了します。端末ドライバのモードが異なるため、getchar()入力の終了条件が異なることがわかります。通常モードでは、キャリッジリターンまたはEOFが必要です。1文字モードでは、文字が入力されてゲームが終了します。

Copyright © Windowsの知識 All Rights Reserved