web-dev-qa-db-ja.com

EOF文字を自分で記述できますか?

C++のような言語のほとんどは、ファイルに書き込むときに、次のようなステートメントを書くのを忘れたとしてもEOF文字を置きます。

filestream.close

ただし、何らかの方法があります。たとえば、C++では、要件に応じてEOF文字を配置できます。または、C++で提供される関数を使用する以外に使用できる他の方法もあります。

さらに情報が必要な場合は、コメントをお寄せください。

前もって感謝します。

編集:ご支援いただきありがとうございますが、この質問に追加されます:

OSをだましてEOF文字をファイルに配置し、notepad.exeのようなアプリケーションがEOF EOF文字の後に読むことができません。このトピックに関連する質問への回答を読んだことがあり、最近のOSでは一般的にEOF文字ではなく、ファイルの長さを確認してファイルの長さを知る正しい考えを取得しますが、ファイルの長さを確認してからファイルレコードを更新するOSの手順が必要です。

見積もりの​​いずれかの時点で間違っている場合は申し訳ありませんが、多くの新しいアイデアにつながる可能性があるのでご協力ください。

38
Apoorv Saxena

EOF文字はありません。 EOFは定義上、「有効な文字コードとは異なります」。多くの場合、-1です。どの時点でもファイルに書き込まれません。

DOSには歴史的なEOF文字値(CTRL + Z)がありますが、最近では廃止されています。

Apoorvのフォローアップの質問に答えるために OSはファイルデータを使用してファイルの長さを決定することはありません(ファイルは決して「nullで終了」しません)。したがって、OSをだますことはできません。おそらく、古い愚かなプログラムは、CTRL + Z文字の後に読み込まれません。 Windowsアプリケーション(メモ帳も含む)がそれを行うとは思いません。私の推測では、ヌル(\0)文字でそれらをだます方が簡単だろう。

50
ypnos

EOFは、C stdio.hヘッダーファイルで定義された関数によって返される値です。 OSによってすべての読み取り機能に実際に返されるため、システムに依存します。 OSはファイルの終わりに達すると、それを関数に送信します。関数は戻り値で最も一般的に(-1)配置しますが、常にそうとは限りません。したがって、要約すると、EOFは文字ではなく、OSによって返される定数です。編集:さて、あなたはファイルシステムについてもっと知る必要があります this。 を見てください

こんにちは、2番目の質問:

もう一度、filesystemsをよく見る必要があります。 FATは非常に良い例です。FATは多くの記事を見つけることができるため、その原理はNTFSに非常に似ています。とにかく、もう一度、EOF is NOT a characterです。ファイルに直接配置することはできません。そうすることができたら、結果を想像してください。システムによって。

どうして? OSは非常に複雑なレイヤー構造のように機能します。レイヤーの1つはファイルシステムドライバーです。ドライバーが認識しているすべてのファイルシステムからデータを確実に転送します。アプリケーションと、ファイルをHDDに保存する実際のシステムとの間のブリッジを提供します。

正確には、FATファイルシステムはいわゆるFATテーブルを使用します。これは、HDD(またはパーティション)アドレス空間の開始近くにあるテーブルで、すべてのクラスター(小さなストレージセル)のマップが含まれます。 OK、だから今、HDDにファイルを保存したいとき、OS(ファイルシステムドライバー)はFATテーブルを調べ、値 "0x0"を検索します。この「0x0」値は、FATテーブル内のその値の位置によって記述されるアドレスが自由に書き込むことができることをOSに伝えます。

そのため、ファイルの最初の部分を書き込みます。それよりも、FATで別の「0x0」値を探し、見つかった場合は、ファイルの2番目の部分を指すクラスターに書き込みます。それよりも、ファイルが置かれている最初のFATテーブルレコードの値を、この場合はファイルの2番目の部分の物理アドレスに変更します。

ファイルがすべてHDDに保存されると、最後の部分が表示され、必要なEOF= valueが書き込まれますが、HDDの「データ部分」ではなく、FATテーブルに書き込まれます。ファイルは次回に読み込まれますが、これで終わりであることがわかります。これ以上は見ないでください。

だから、今、あなたは手動でEOF valueが属していない場所に値を書きたいなら、FATレコードを書き換えることができる独自のドライバを書かなければならない、しかしこれは初心者にとっては実際上不可能です。

13

Kernighan&Ritchie [〜#〜] c [〜#〜]エクササイズを行っている間にここに来ました。

Ctrl+D stdio.hからEOF定数に一致する文字を送信します。

(編集:これはMac OS Xにあります。Windows10に相当するものは@markmnlに感謝します。 Ctrl+Z

12
chbrown

実際、C++には、fprintf()またはostreamメカニズムを使用してファイルに書き込まれる物理的なEOF文字はありません。EOFは示すI/O条件ですこれ以上読み込むデータはありません。

CP/Mなどの初期のディスクオペレーティングシステムでは、実際に物理的な0x1A(ASCII SUB文字)を使用してEOFを示していました。これは、ファイルシステムが実際の長さのカウントをディレクトリに格納するようになったため、「インバンド」ファイルデータの一部として「EOF」文字を格納することはもはや一般的ではありません。

7
Amardeep AC9MF

Windowsでは、stdinでASCII 26(EOF))に遭遇すると、残りのデータの読み取りが停止します。この文字を書き込むと、stdoutに送信された出力も終了しますが、確認できませんでした。ストリームをバイナリモードに切り替えることができます このようにSO question

#include <io.h>
#include <fcntl.h>
...
_setmode(0, _O_BINARY)

また、0x0Aが0x0D 0x0Aに変換されるのを停止するだけでなく、0x1Aの読み取り/書き込みも可能になります。 stdin(0)とstdout(1)の両方を切り替える必要がある場合があることに注意してください。

5
Malvineous

「EOF」キャラクターのようなものはありません。ストリーム自体を閉じるという事実は、「EOF」状態です。

を押すと Ctrl+D UNIXシェルでは、標準入力ストリームを単純に閉じます。これは、シェルによって「EOF」として認識され、終了します。

そのため、「EOF」を「送信」するには、「EOF」を送信する必要があるストリームを閉じるだけです。

4
rustyx

EOF文字でControl-Zのようなものを意味する場合、最新のオペレーティングシステムはそのようなものを必要とせず、C++ランタイムはそれを作成しません。もちろん書くことができますあなた自身:

 filestream.put( 26 );     // write Ctrl-Z

しかし、そうする正当な理由はありません。する必要もありません:

 filesystem.close();

ファイルストリームはデストラクタが呼び出されると自動的に閉じられますが、そうすることをお勧めします(と思う)。

4
anon

_[f]truncate_ システムコールについてはまだ誰も言及していません。これは、ファイルを最初から作り直さずにファイルを短くする方法です。

truncate()およびftruncate()関数は、pathで指定された、またはfdで参照された通常のファイルを正確にlengthバイト。

以前にファイルがこのサイズより大きかった場合、余分なデータは失われます。以前にファイルが短かった場合、ファイルは拡張され、拡張部分はヌルバイト(_'\0'_)として読み込まれます。

これは、あらゆる種類のデータをファイルに書き込むこととは異なる操作であることを理解してください。ファイルはバイトの線形配列であり、何らかの形でディスク上に配置され、メタデータの長さを示します。 truncateはメタデータを変更します。

3
zwol

最近のファイルシステムでは、EOFは文字ではないため、ファイルへの書き込みが終了したときに発行する必要はありません。ファイルを閉じるか、OSに任せるだけです。プロセスが終了したとき。

2
mouviciel

はい、手動でEOFをファイルに追加できます。1)Macターミナルで、新しいファイルを作成します。 touch filename.txt

2)VIでファイルを開く

vi filename.txt

3)挿入モード(ヒットi)で、Ctrl + V、次にControl + Dと入力します。 MacのControlキーを放さないでください。

あるいは、^ N ^ M ^ O ^ Pなど、他の^ NewLetterが必要な場合は、Contorl + Vを実行してからControl + NewLetterを実行できます。たとえば、^ Oを実行するには、コントロールを押したまま、VとOを入力してからControlを放します。

0
Gene