2

たとえば、ファイルを開いてレコードを配列に読み込む前に、バイナリファイルにレコードがいくつあるかをより適切に知るにはどうすればよいですか?

MyFile = fopen("DATA.dat", "rb");
i = 0;
while (feof(MyFile) == 0) {
   fread(&tempReadingRecord,sizeof(tempReadingRecord), 1, file);
     if (feof(MyFile) == 0 {
     i++;
     }
   }
 fclose(MyFile);
}
printf("%d", i); /* does work to find out how many records but optimal? */
4

4 に答える 4

6

固定サイズのレコードのファイル全体を処理しているように見える場合は、ファイルの最後までシークし、現在の位置を取得して、レコードサイズで割ることができます。理論的には、これには移植性の問題があります(バイナリファイルの末尾に任意の数のNULを追加できます)が、実際には、ほとんどの一般的なシステム(AFAIK、主にCP / Mで発生します)で問題が発生することはありません。ファイルの長さを明示的に保存せず、ブロック数だけを保存したため、ファイルの最後は常に最後のブロックを埋めるために埋め込まれていました)。

ところで、レコードを読み取るためのループには問題があります。実際、この種のほとんどすべてのループwhile (!feof(file))、または同様のものは、事実上正しく機能しないことが保証されています(通常、最後のレコードを2回「読み取り」ます)。

于 2009-11-30T21:01:10.717 に答える
4

固定サイズのレコードのみを含むファイル全体を処理している場合(これが当てはまるようです)、statを使用してファイルの合計サイズを取得できます。statはファイルシステム自体からこの情報を取得するため、事前にファイルを開く必要はありません。私のLinuxボックスでは、このプログラムがトリックを実行します。


int main() {

   const char * const filename = "/bin/ls";

   struct stat buf;

   if ( 0 == stat(filename, &buf) ) {
      printf("File: %s - Size: %d\n", filename, buf.st_size);
   }

   return 0;

}

上記のプログラムは、バイナリlsの合計サイズを出力します。ファイルの合計サイズが決まったら、それをレコードを表す構造体のサイズで割るだけです。これにより、ファイル内のレコードの総数がわかります。

于 2009-11-30T22:35:57.773 に答える
2

彼らはどのような記録ですか?

それらが固定長の場合は、ファイルサイズを取得し、それをレコードサイズで除算します。

于 2009-11-30T20:58:19.000 に答える
0

サイズが固定されている場合は、Jerryのソリューションを使用してください。そうでない場合は、emをそのまま読み取ることが、私が考える唯一の方法です。ところで、オブジェクトの数に基づいてファイルを読み込む/読み込まない場合がありますか?

于 2009-12-01T03:21:07.997 に答える