MW211 EXIT

devlog
C言語/fread()の端数
2013年05月31日
┌──────────────────────────────────────┐
│読込件数 = fread(読込先,                                                    │
│                 一件あたりのサイズ,                                        │
│                 要求件数,                                                  │
│                 fp);                                                       │
└──────────────────────────────────────┘
「fread()」は「一件あたりのサイズ(列)」×「要求件数(行)」のように指定して
面としてデータを取得する関数だ。

じゃ、こんな感じで端数が出た時はどうなるのか?
┌──────────────────────────────────────┐
│■■■■                                                                    │
│■■■■                                                                    │
│■■■                                                                      │
└──────────────────────────────────────┘

ちゃんと端数分も含めて最後まで取得してくれる。
┌──────────────────────────────────────┐
│■■■■                                                                    │
│■■■■  ←読込件数2件                                                     │
│■■■←ここまで取得される                                                  │
└──────────────────────────────────────┘
読込件数は完全に読み込まれた行数分となるので、要求件数と比較すると足りなくなる。

よって、「読込件数<要求件数」でEOF到達が認識できる(厳密には「feof()」と併用)。

他のポイントとしては、端数以降の部分はひっぱってこないということ。
┌──────────────────────────────────────┐
│■■■■                                                                    │
│■■■■                                                                    │
│■■■□←この部分は読込先に上書されない                                    │
└──────────────────────────────────────┘
「列×行」分ひっぱってくれて、余白は0で埋めてくれたりはしないってこと。
ま、足りない行分もひっぱってこないから当然といえば当然。
とにかく事前の初期化は大事なようだ。
分類:C/C++