最後のプリントをどうやって見ることができますか?言い換えれば、EOFに何を入れるのですか?定義を確認したところ、EOFは-1と表示されています。
Ctrl-Dを入力すると、何も表示されません。
#include <stdio.h>
int main() {
int c;
while((c = getchar() != EOF)) {
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
LinuxシステムおよびOSXでは、EOFを発生させるために入力する文字はCtrl-Dです。Windowsの場合はCtrl-Zです。
オペレーティングシステムによっては、この文字は行の最初の文字、つまり。の後の最初の文字である場合にのみ機能しEnterます。コンソール入力は多くの場合行指向であるため、システムは、フォローアップするまでEOF文字を認識しない場合がありますEnter。
はい、その文字がEOFとして認識された場合、プログラムは実際の文字を認識しません。代わりに、Cプログラムはからを取得-1
しgetchar()
ます。
かっこを次のように変更する必要があります
while((c = getchar()) != EOF)
「=」演算子は「!=」演算子よりも優先順位が低いためです。次に、期待される結果が得られます。あなたの表現は等しい
while (c = (getchar()!= EOF))
「c!= EOF」を比較しているため、2つの1が出力として取得されます。これは、入力した文字と、それに続く「\n」のリターンキーを押すと常に1つになります。cが実際にEOFである最後の比較を除いて、0が返されます。
EOFに関する編集:EOFは通常-1ですが、これは標準によって保証されていません。この規格では、セクション7.19.1でEOFについてのみ定義されています。
EOFは、int型で負の値の整数定数式に展開され、ファイルの終わり、つまりストリームからの入力がなくなったことを示すためにいくつかの関数によって返されます。
EOFが-1に等しいと仮定するのは合理的ですが、EOFを使用する場合は、特定の値に対してテストするのではなく、マクロを使用する必要があります。
EOFの値は、0〜255の範囲の「char」値と区別するための負の整数です。通常は-1ですが、POSIX仕様によれば、他の負の数にすることもできます。 -1であると想定しないでください。
^ D文字は、UNIX / Linuxのコンソールストリームで入力して、入力ストリームを論理的に終了するように指示するものです。ただし、他のコンテキスト(ファイルから読み取る場合など)では、これは単なる別のデータ文字です。いずれにせよ、^ D文字(入力の終わりを意味する)がアプリケーションコードに到達することはありません。
@Bastienが言うように、getchar()
失敗した場合もEOFが返されます。厳密に言えば、EOFがエラーを表しているのか、ストリームの終了を表しているのかを確認するために、ferror
またはを呼び出す必要があります。feof
ただし、ほとんどの場合、アプリケーションはどちらの場合も同じことを行います。
タイプミスのカップル:
while((c = getchar())!= EOF)
代わりに:
while((c = getchar() != EOF))
また、getchar()はリターンキーを有効な入力として扱うため、それもバッファリングする必要があります。EOFは、入力の終了を示すマーカーです。通常、これはすべてのビットが設定されたintです。
#include <stdio.h>
int main()
{
int c;
while((c = getchar())!= EOF)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}
printf("%d %u %x- at EOF\n", c , c, c);
}
プリント:
49 50 -1 4294967295 ffffffff- at EOF
入力用:
1 2 <ctrl-d>
EOFはファイルの終わりを意味します。これは、ファイルの終わりに到達し、データがなくなることを示しています。
編集:
私は正直に立っています。この場合、それはファイルの終わりではありません。前述のように、CTRL + d(linux)またはCTRL + z(windows)が渡されると渡されます。
端末からの入力は(デバイスが切断されていない限り)実際に「終了」することはありませんが、端末に複数の「ファイル」を入力すると便利なので、入力の終了を示すためにキーシーケンスが予約されています。UNIXでは、キーストロークのEOFへの変換はターミナルドライバによって実行されるため、プログラムはターミナルを他の入力ファイルと区別する必要はありません。デフォルトでは、ドライバーは行の先頭にあるControl-D文字をファイルの終わりインジケーターに変換します。実際のControl-D(ASCII 04)文字を入力ストリームに挿入するには、ユーザーはその前に「引用」コマンド文字(通常はControl-V)を付けます。AmigaDOSも同様ですが、Control-Dの代わりにControl-\を使用します。
MicrosoftのDOSおよびWindows(およびCP / Mおよび多くのDECオペレーティングシステム)では、端末からの読み取りでEOFが生成されることはありません。代わりに、プログラムはソースが端末(または他の「文字デバイス」)であることを認識し、指定された予約文字またはシーケンスをファイルの終わりの標識として解釈します。最も一般的には、これはASCII Control-Z、コード26です。MicrosoftMS-DOSシェル(COMMAND.COM)の一部やオペレーティングシステムユーティリティプログラム(EDLINなど)を含む一部のMS-DOSプログラムは、Control-Zを扱います。意味のあるデータの終わりを示すものとしてテキストファイル内にある、および/またはテキストファイルを書き込むときに最後にControl-Zを追加します。これは2つの理由で行われました。
CP/Mとの下位互換性。CP / Mファイルシステムは、ファイルの長さを128バイトの「レコード」の倍数でしか記録しなかったため、慣例により、レコードの途中で終了した場合、意味のあるデータの終わりを示すためにControl-Z文字が使用されました。MS-DOSファイルシステムは常にファイルの正確なバイト長を記録しているため、MS-DOSではこれは必要ありませんでした。
これにより、プログラムは同じコードを使用して、端末とテキストファイルの両方から入力を読み取ることができます。
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
これはEOFの値をチェックする正しい方法だと思います。そして、出力を確認しました。
INPUT:abcおよびEnterの場合、OUTPUT:97 98 99 10.(ASCII値)を取得しました
INPUT Ctrl-Dの場合、EOFでOUTPUT:-1-を取得しました。したがって、-1はEOFの値だと思います。
Ctrl-Zのように、Ctrl-Dの代わりに他の入力を試してください。コンパイラによって違うと思います。
簡単にするために:EOFは値-1の整数型です。したがって、EOFをテストするには整数変数を使用する必要があります。
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) {
putchar(c);
}
printf("%d at EOF\n", c);
}
EOFをより明確にするために上記のコードを変更し、Ctrl + dを押すと、putcharを使用してcharを印刷し、whileループ内でprintfを使用しないようにします。
int c;
while((c = getchar())!= 10)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}