2009-07-04 4 views
6

Rubyの文字列にEOFシンボルを書き込むプラットフォームに依存しない方法はありますか? * nixではシンボルが^Dだと信じていますが、Windowsでは^Zだから、私は尋ねます。Rubyクロスプラットフォームの方法でEOFシンボルを書く

+0

好奇心の理由から、なぜこれが必要ですか?例えば、 –

+0

。私はEOFマーカーがないので、私は "変換"(ImageMagick)で私に変換できないいくつかのPDFファイルを持っています。同時に、それらのファイルをデスクトップアプリケーションで見ることができます。そのようなマーカーを追加してからPDFを変換しようとしています... –

答えて

17

EOFは文字ではなく、状態です。端末は、この状態を表すために制御文字を使用します(C-d)。そのようなことは "EOF 文字"と同じものを書くことではありません。ファイルに書き込む場合は、完了したら閉じてください。このmailing list postを参照してください:あなたは、インバンドが、特殊な文字、ファイルの終わりを示し 値としてEOF を考えているよう

ですね。 は、それを 帯域外のセンチネル値と考える方が良いです。 Cでは、EOF は通常-1で、関連付けられたAPI は整数戻り値を指定します。したがって は有効なインバンド値と混同されないようにEOFが保証されています。

は、ここではいくつかのより多くの証拠(Unix上でこれを行う)です。

$ cat > file 
hello^V^Dworld 
^D 
$ cat file 
helloworld 

型付け^ V^Dは、ファイルに文字通り制御-Dの文字を挿入します。 worldと入力した後、^ Dはパイプを閉じます。ファイルは12バイトの長さの10文字になり、^ Dと改行のために2つ多くなります。最終的な^ Dはファイルには終りません。これはちょうどターミナル/シェルによってパイプを閉じるために使用されます。

+5

EOFが文字であるというのはよくある誤解です – GogaRieger

5

一般にEOF文字はありません。つまり、これにはクロスプラットフォームのソリューションはなく、特定のプラットフォーム上でさえも、そのようなキャラクターの処理は純粋に従来のものであり、矛盾しています。ファイルを閉じて終了します。

しかし、賢明であるために、特定のモードでファイルを読むときの特定のオペレーティングシステムは、ファイル文字のリテラルの末尾をサポートしています。たとえば、Windows環境でC stdio APIを使用してテキストモードでファイルを読み取る場合、リテラルコントロール-Z(文字コード26)はファイルの終わりをstdioに通知します。これはCP/Mからのホールドオーバーとして持っているMS-DOSからのホールドオーバーです。 stdioを使用してバイナリモードでファイルを読み込むと、control-Zはファイルを終了しません。

それにもかかわらず、「知っている、使用しない」という機能だけと考えるべきです。あなたがWindows上で忠実な入出力を見ることができたらそれについて知りたいですが、それを使用するのは狂気です。

関連する問題