バイナリ ファイルの長さを取得するための慣用的なスニペットがあります。
fseek(my_file, 0, SEEK_END);
const size_t file_size = ftell(my_file);
…ペダンティックであることfseek(file, 0, SEEK_END)
は、バイナリ ストリームに対して未定義の動作をすることを知っています[ 1 ] – しかし、率直に言って、これが問題であるプラットフォームでは、私も持っていませんfstat()
。とにかく、これは別の質問のトピックです…</p>
私の質問は次のとおりfseek()
です。この場合、戻り値を確認する必要がありますか?
if (fseek(my_file, 0, SEEK_END)) {
return 1;
}
const size_t file_size = ftell(my_file);
このようなケースでチェックされたのを見たことがありません。また、ここでどのようなエラーが返される可能性があるfseek()
のかも気になります。fseek()
編集:
Clifford's answerを読んだ後、ファイルのサイズを計算する際に値を処理しfseek()
てftell()
返す最良の方法は、専用の関数を作成することだとも思います。ただし、Clifford の良い提案ではsize_t
データ型を処理できませんでした (結局、サイズが必要です!)。そのため、最終的に最も実用的なアプローチは、ファイルのサイズを格納するためにポインターを使用し、戻り値を保持することだと思います。故障専用機能の価値。安全なサイズ計算機のためのクリフォードのソリューションへの私の貢献は次のとおりです。
int fsize (FILE * const file, size_t * const size) {
long int ftell_retval;
if (fseek(file, 0, SEEK_END) || (ftell_retval = ftell(file)) < 0) {
/* Error */
*size = 0;
return 1;
}
*size = (size_t) ftell_retval;
return 0;
}
そのため、ファイルの長さを知る必要がある場合は、次のように簡単に実行できます。
size_t file_size;
if (fsize(my_file, &file_size)) {
fprintf(stderr, "Error calculating the length of the file\n");
return 1;
}