私は、バイナリファイルを読み込むためにC言語で次のメソッドを使用していますが、それぞれのエラー値を確認する必要があり長時間となります。fread
コール、これを対応して?複数のfreadコールからのエラーを処理するためのちょっとした方法
構造体を一度に読み込むことで呼び出しの一部を減らすことができますが、Cが構造体のメンバーの間にどのようにパディングバイトを追加できるかによって、これを避けることをお勧めします。
some_type_t *load_something(FILE *file) {
some_type_t *something = (some_type_t *)malloc(sizeof(some_type_t));
if (something == NULL) {
return NULL;
}
if (fread(&something->field1, sizeof(something->field1), 1, file) == 0) {
free(something);
return NULL;
}
if (fread(&something->field2, sizeof(something->field2), 1, file) == 0) {
free(something);
return NULL;
}
if (fread(&something->field3, sizeof(something->field3), 1, file) == 0) {
free(something);
return NULL;
}
uint16_t some_var1, some_var2, some_var3;
some_other_type_t *something_else1 = (some_other_type_t *)malloc(sizeof(some_other_type_t));
if (fread(&some_var1, sizeof(some_var1), 1, file) == 0) {
free(something);
free(something_else1);
return NULL;
}
some_other_type_t *something_else2 = (some_other_type_t *)malloc(sizeof(some_other_type_t));
if (fread(&some_var2, sizeof(some_var2), 1, file) == 0) {
free(something);
free(something_else1);
free(something_else2);
return NULL;
}
some_other_type_t *something_else3 = (some_other_type_t *)malloc(sizeof(some_other_type_t));
if (fread(&some_var3, sizeof(some_var3), 1, file) == 0) {
free(something);
free(something_else1);
free(something_else2);
free(something_else3);
return NULL;
}
// Do something with the vars and allocated something elses.
// ...
return something;
}
魅力的に見えますが、私が読んでいるところでは、もっと自由にする必要があるかもしれないという複雑さが増しています。それを反映するように質問を更新します。 – DanielGibbs
ポインタがNULLであれば、問題は発生しない限り、すべてが解放されます。 –
ラッパーマクロを使用して、書き込みと読み取りを同期した状態に保つことさえできます。 –