我有以下方法在C加載一個二進制文件,它似乎相當長和乏味的檢查每個fread
調用的錯誤值,有沒有一個更好的方法來處理這個(事情?我知道可以通過一次性讀取結構來減少一些調用,但由於C可以如何在結構成員之間添加填充字節,我寧願避免這種情況。Neater的方式來處理來自多個fread調用的錯誤
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,它不會是一個問題。 –
你甚至可以使用包裝宏來保持寫入和讀取同步。 –