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

标签 c stdio

我正在编写一些生成大量

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/

相关文章:

java - System.out、stdout 和 cout 是一回事吗?

c - 将非空字符串传递给 snprintf 会导致不相关的 char* 数组更改地址

c - 在 C 中显示从 2 到 10,000 的素数

C : conditional memory allocation

c++ - 简单的 C 和 C++ 可执行程序在 Windows 7 中挂起

c - 在函数中打开二进制文件?请参阅代码 :

node.js - 是否可以推送文本来提示输入?

command-line - 如何在命令行上运行Markdown Extra?

c - 如何使用 win32API 在 ListView 中选择一行

c++ - 计算中常用值的预定义 - 它会改变什么吗?