处理 stdio 文件写入函数的返回值的良好编程模式是什么

2023-11-21

我正在编写一些生成大量代码的代码

ignoring return value of ‘size_t fwrite(const void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result

使用 g++ 编译时出现警告,我想知道实际记录和处理大量单独顺序的返回值的最佳编程模式fwrites(即不相同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 ...

Update:我删除了 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 错误之外还有其他错误情况,您仍然需要使用一个或多个错误变量来跟踪它们。

Also, your check against sizeof(blah) is wrong: fwrite() returns the count of objects written!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 stdio 文件写入函数的返回值的良好编程模式是什么 的相关文章

随机推荐