doubleの配列を読みたいとしましょう。次に、このコードを使用します。
FILE *fp;
int n=100;
fp=fopen("file.bin","rb");
double *array=(double*)calloc(n,sizeof(double));
fread(array,sizeof(double),n,fp);
fclose(fp);
fread()
関数に安全に使用できる最大nはいくつですか?
答えはC標準7.19.8で提供されています。N1256ドラフトを使用します。
size_t fread(void * restrict ptr,
size_t size, size_t nmemb,
FILE * restrict stream);
[7.19.8.1]には制限がないため、との値はsize
、nmemb
が指すストレージに十分なサイズがある限りSIZE_MAX
、タイプによって提供される最大値([7.18.3.2])まで可能です。ptr
fread
実際にその数の要素を読み取ることが保証されているわけではありません。
7.19.8.1.2
fread
アレイによって指さに関数は、読み出しptr
、までnmemb
そのサイズによって指定される要素size
[...]部分エレメントが読み出された場合、その値は不定です。(私の強調)
限りmalloc
、それを割り当てることができ、あなたがそれを埋めることができますfread
が、fread
要素の数が少ない読みして自由です。たとえば、適合fread
実装はmin(SIZE_MAX/size, nmemb)
、一度に要素を読み取ることに合理的に制限される可能性があります。
そのため、あなたの使用fread
は間違っています。読む必要のあるものを読み終えるか、エラーが発生するか、ファイルの終わりに達するまで、読み続ける必要があります。読む前にテストしないでくださいfeof
!。
void processData(double * data, size_t count);
void readData(void) {
FILE *file = fopen("file.bin","rb");
size_t n = 100;
if (file) {
double * array = calloc(n, sizeof(double));
double * head = array;
if (!array) break;
while (n) {
size_t n_read = fread(head, sizeof(double), n, file);
head += n_read;
n -= n_read;
if (feof(file) || ferror(file)) break;
}
processData(array, head-array);
fclose(file);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加