私は、通常、コードのメインストリームでfseek
/ftell
コードを直接使用するべきではないという彼らの基本的な結論に同意する傾向がありますが、おそらくどちらも使用すべきではありませんfstat
。ファイルのサイズが必要な場合、ほとんどのコードでは、のような明確で直接的な名前の何かを使用する必要がありますfilesize
。
さて、利用可能な場合、および(たとえば) Windows(通常は利用できない最も明白なプラットフォーム)を使用して実装する方がおそらく良いでしょう。fstat
FindFirstFile
fstat
話の反対側は、fseek
バイナリファイルに関する制限の多く(ほとんど?)が実際にはCP / Mに由来し、ファイルのサイズをどこにも明示的に保存していなかったことです。テキストファイルの終わりは、control-Zによって通知されました。ただし、バイナリファイルの場合、実際に知っているのは、ファイルの保存に使用されたセクターだけです。最後のセクターでは、多くの場合(常にではありませんが)ゼロで埋められた未使用のデータがありました。残念ながら、有意であったゼロ、および/または有意ではなかった非ゼロ値が存在する可能性があります。
C規格全体が承認される直前に作成されていた場合(たとえば、1988年に開始され、1989年に終了した場合)、CP/Mを完全に無視していた可能性があります。しかし、良くも悪くも、CP / Mがまだ十分に広く使用されていて無視できないとき、彼らは1982年かそこらのようなものでC標準の作業を開始しました。CP / Mがなくなるまでに、多くの決定がすでに行われており、誰もがそれらを再検討したいとは思わなかった。
しかし、今日のほとんどの人にとって、意味はありません。ほとんどのコードは、大規模な作業なしではCP/Mに移植されません。これは、対処すべき比較的小さな問題の1つです。最新のプログラムをコードとデータの両方でわずか48K(またはそれくらい)のメモリで実行することは、はるかに深刻な問題です(大容量記憶装置用に最大メガバイト程度を持っていることは別の深刻な問題です)。
ただし、CERTには1つの良い点があります。ファイルのサイズを見つけて、そのスペースを割り当ててから、ファイルの内容がそこに収まると想定するべきではないということです。fseek / ftellは最新のシステムで正しいサイズを提供しますが、そのデータは実際にデータを読み取るまでに古くなる可能性があるため、とにかくバッファーをオーバーランする可能性があります。