24

EOF私は、テキスト ファイルの終わりを示すためにテキスト ファイルの最後に自動的に挿入される特殊文字であるという知識で、ここまで管理してきました。しかし、私は今、これについてもう少し明確にする必要があると感じています. Google とウィキペディアのページで確認しましたEOFが、次の質問に答えることができませんでした。また、これに対する正確なスタック オーバーフロー リンクもありません。だからこれについて私を助けてください:

  • 私の本によると、バイナリ モード ファイルは、ファイルのディレクトリ エントリに存在する文字数からファイルの終わりを追跡します。(終了を示す特殊な EOF 文字を持つテキスト ファイルとは対照的です)。EOFでは、バイナリ ファイルのコンテキストではどのような話になるのでしょうか? 次のプログラムでは、ファイルからバイナリモードで!=EOF読み取り中に比較を正常に使用しているため、混乱しています。.exe

     #include<stdio.h>
     #include<stdlib.h>
    
     int main()
     {
    
      int ch;   
      FILE *fp1,*fp2;
    
      fp1=fopen("source.exe","rb");
      fp2=fopen("dest.exe","wb");
    
      if(fp1==NULL||fp2==NULL)
      {
      printf("Error opening files");
      exit(-1);
      }
    
      while((ch=getc(fp1))!=EOF)
      putc(ch,fp2);
    
      fclose(fp1);
      fclose(fp2);
    
      }
    
  • EOF特別な「キャラクター」ですか?それとも、ウィキペディアが言うように、コンピューターが特定の値をいつ返すかを知っている状態ですか-1(EOF私のコンピューターで)? そのような「状態」の例は、文字読み取り関数が存在するすべての文字の読み取りを終了したとき、または文字/文字列 I/O 関数が読み取り/書き込みでエラーに遭遇したときですか?

    興味深いことに、 のスタック オーバーフロー タグEOFは、 EOF. 「プログラミング領域では、EOF は一連のバイト (または文字) であり、この後にコンテンツがないことを示します」EOFというタグ。、「ファイルの終わり(一般にEOFと略される)は、データソースからデータを読み取ることができないコンピューターオペレーティングシステムの状態です。データソースは通常、ファイルまたはストリーム。"

EOFしかし、I / O中にエラーが発生したときに他のすべての関数がそれを返すように見えるので、私はキャラクターにはならないだろうと強く感じています。

私に代わって問題を解決していただければ、本当に助かります。

4

5 に答える 5

2

これで問題が解決するはずです。

基本的に、EOF は、読み取るデータがこれ以上ないことを示す I/O 関数からのエラー コードを表す定義済みの値を持つ単なるマクロです。

于 2013-05-21T19:13:48.133 に答える
1

ファイルには実際には EOF が含まれていません。EOF は一種の文字ではありません。1 バイトは 0 から 255 の間であることに注意してください。したがって、ファイルに -1 が含まれていても意味がありません。EOF は、使用しているオペレーティング システムからの信号であり、ファイルの終わりに達したことを示します。getc() がどのようにint- を返すかに注意してください。つまり、-1 を返して、ストリームがファイルの最後に達したことを通知できます。

EOF シグナルは、バイナリ ファイルとテキスト ファイルで同じように処理されます。バイナリ ファイルとテキスト ストリームの実際の定義は、OS によって異なります (たとえば、*nix では、バイナリ モードとテキスト モードは同じものです)。ファイル自体の一部ではありません。OS はそれを getc() に渡して、ストリームの終わりに達したことをプログラムに伝えます。

GNU C ライブラリから:

このマクロは、多数のナロー ストリーム関数によって返される整数値であり、ファイルの終了条件またはその他のエラー状況を示します。GNU C ライブラリでは、EOF は -1 です。他のライブラリでは、その値は他の負の数である可能性があります。

于 2013-05-21T19:22:21.950 に答える
0

EOFはキャラクターではありません。この文脈では、それは -1 であり、技術的には文字ではありません (非常に正確にしたい場合は、文字である可能性があると主張できますが、それはこの議論では関係ありません)。 EOF、明確にするために、「ファイルの終わり」です。ファイルを読み込んでいる間は、いつ停止するかを知る必要があります。そうしないと、ファイルの末尾を超えて読み込もうとすると、環境によってはさまざまなことが起こる可能性があります。

そのため、ファイルの読み取り中にファイルの終わりに達したことを通知するマクロが考案されましたEOF。これはではなく をgetc返すため機能するため、signal にa 以外のものを返す余裕があります。他の I/O 呼び出しは、例外をスローするなど、異なる方法で通知する場合があります。intcharcharEOFEOF

興味深い点として、DOS では (おそらく Windows でもまだ?)、実際の物理的な文字^Zがファイルの最後に配置され、ファイルの終わりを知らせていました。つまり、DOS には実際にEOF文字がありました。Unixにはそのようなことはありませんでした。

于 2013-05-21T19:21:07.860 に答える
-1

バイナリ ファイルの構造を調べれば、バイナリ ファイルの EOF を見つけることはほぼ可能です。

いいえ、OS が実行可能な EOF の EOF を知る必要はありません。

ほぼすべての種類の実行可能ファイルにはページ ゼロがあり、OS がコードをメモリにロードする際に必要となる可能性のある基本情報を記述し、その実行可能ファイルの最初のページとして保存されます。

MZ 実行可能ファイルの例を見てみましょう。 https://wiki.osdev.org/MZ

ここでオフセット 2 には、完全/部分ページの合計数があり、その直後のオフセット 4 には、最後のページのバイト数があります。この情報は通常、コードをメモリに安全にロードするために OS によって使用されますが、バイナリ ファイルの EOF を計算するために使用することもできます。

アルゴリズム:

 1. Start
 2. Parse the parameter and instantiate the file pointer as per your requirement.
 3. Load the first page (zero) in a (char) buffer of default size of page zero and print it. 
 4. Get the value at *((short int*)(&buffer+2)) and store it in a loop variable called (short int) i.
 5. Get the value at *((short int*)(&buffer+4)) and store it in a variable called (short int) l.
 6. i--
 7. Load and print (or do whatever you wanted to do) 'size of page' characters into a buffer until i equals zero.
 8. Once the loop has finished executing just load `l` bytes into that buffer and again perform whatever you wanted to 
 9.  Stop

独自のバイナリ ファイル形式を設計している場合は、そのファイルの先頭にある種のメタ データを追加するか、そのファイルの終わりを示す特殊文字または単語を追加することを検討してください。

また、OS が他の情報と一緒にファイルをどこかに保存しているように見えても、簡単な計算とメタデータの分析を使用して、OS がここからファイルのサイズをロードする可能性は十分にあります。 store (冗長性を減らすための抽象化)。

于 2020-04-06T08:02:44.193 に答える