我正在编写一些生成大量
ignoring return value of ‘size_t fwrite(const void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
使用 g++ 编译时出现警告,我想知道实际记录和处理大量单独的顺序 fwrite
的返回值的最佳编程模式(即不同的 fwrite
循环)
假设代码现在看起来像这样:
fwrite (&blah, sizeof (blah), 1, fp);
// ... more code ...
fwrite (&foo, sizeof (foo), 1, fp);
// ... more code ...
我目前正在考虑这样的事情,但我可能难以清理文件指针:
if (fwrite (&blah, sizeof (blah), 1, fp) != 1) return someerrorcode;
// ... more code ...
if (fwrite (&foo, sizeof (foo), 1, fp) != 1) return someerrorcode;
// ... more code ...
我认为这种方法显然比嵌套要好,嵌套太快太疯狂了:
if (fwrite (&blah, sizeof (blah), 1, fp) == 1) {
// ... more code ...
if (fwrite (&foo, sizeof (foo), 1, fp) == 1) {;
// ... more code ...
}
}
不过,对于这类事情肯定已经有一个既定的最佳实践模式了吧?
当然,因为我主要研究这个是为了消除编译器警告,所以我可以将返回值分配给一个虚拟变量并忽略它,但我想先尝试以正确的方式进行。
dummy = fwrite (&blah, sizeof (blah), 1, fp);
// ... more code ...
dummy = fwrite (&foo, sizeof (foo), 1, fp);
// ... more code ...
更新:我已经删除了 c++ 标签,因为这段代码实际上只是使用 g++ 编译的 c,因此需要基于 c 的解决方案来与代码库的其余部分保持一致。
最佳答案
我会按照这些思路做一些事情:
FILE * file = fopen("foo", "wb");
if(!file) return FAILURE;
// assume failure by default
_Bool success = 0;
do
{
if(!fwrite(&bar, sizeof(bar), 1, file))
break;
// [...]
if(!fwrite(&baz, sizeof(baz), 1, file))
break;
// [...]
success = 1;
} while(0);
fclose(file);
return success ? SUCCESS : FAILURE;
使用一点 C99 宏魔法
#define with(SUBJECT, FINALIZE, ...) do { \
if(SUBJECT) do { __VA_ARGS__ } while(0); if(SUBJECT) FINALIZE; \
} while(0)
并使用 ferror()
而不是 Jonathan Leffler 建议的我们自己的错误标志,这可以写成
FILE * file = fopen("foo", "wb");
with(file, fclose(file),
{
if(!fwrite(&bar, sizeof(bar), 1, file))
break;
// [...]
if(!fwrite(&baz, sizeof(baz), 1, file))
break;
// [...]
});
return file && !ferror(file) ? SUCCESS : FAILURE;
如果除了 io 错误之外还有其他错误情况,您仍然需要使用一个或多个错误变量来跟踪它们。
此外,您对 sizeof(blah)
的检查是错误的:fwrite()
返回写入对象的计数!
关于c - 什么是处理 stdio 文件编写函数的返回值的良好编程模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/569573/