C および C++ 標準では、テキスト ストリームがテキスト モード(デフォルト) で非常に不道徳なことを行うことを許可しています。これらの Unholy Things には、内部の改行マーカーと外部の改行制御文字との間の変換、および特定の文字または文字シーケンスをファイルの終わりを示すものとして扱うことが含まれます。Unix ランドでは行われていませんが、Windows ランドでは行われているため、コードは元の Unix ランドの規則にのみ関連付けることができます。
これは、Windows では、入力を正確に入力にコピーする移植可能な C または C++ プログラムを作成する方法がないことを意味します。
Unix ランドにいる間は、まったく問題ありません。
Windows では、単一の [Ctrl Z] で構成される行は、慣例によりファイルの終わりマーカーです。これは、コンソールだけでなく、テキスト ファイルでも同様です (ツールによって多少異なります)。Windows はこれを DOS から継承し、DOS は CP/M から一般的な考え方を継承しました。
CP/M がどこから入手したかはわかりませんが、Unix の [Ctrl D] とまったく同じではなく、似ているだけです。
Unix ランドでは、ファイルの終わりの一般的な慣例は、単に「これ以上データがない」ことです。コンソールで [Ctrl D] を押すと、デフォルトで入力したテキストが待機中のプログラムにすぐに送信されます。行にまだ何も入力していない場合、0 バイトが送信され、0 バイトを返す読み取りは慣例によりファイルの終わりに遭遇します。
主な違いは、Windows では内部的にファイル内で発生する可能性があるファイル マーカーのテキスト終了はdataであるのに対し、Unix では内部的にはファイル内で発生する可能性がないdata の欠如です。もちろん、Windows はテキストの通常のファイルの終わり (これ以上のデータはありません!) もサポートしています。これは物事を複雑にします – Windows はもっと複雑です。
#include <iostream>
using namespace std;
int main()
{
char ch;
while(cin >> ch) {
cout << 0+ch << " '" << ch << "'" << endl;
}
}