gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:58:15 25 4
gpt4 key购买 nike

我正在编写一些生成大量

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com