当磁盘已满时,可靠地计算由fwrite写入的字节数

有没有人知道一种可靠的方法来计算实际有多少字节
在磁盘已满的情况下使用C标准I / O(fwrite)编写了吗?

我在使这个工作上遇到了很多麻烦.问题似乎是
fwrite是缓冲的,它有时会认为它已经写好了
比设备实际可以接受的字节数更多.

使用与设备块大小相同的小缓冲区,fwrite会
报告它已经写了一个完整的缓冲区,当它实际上没有,所以
计数结束比一个块更正确.我修好了
测试错误,如果没有错误,只添加总数.

但是,使用更大的缓冲区,fwrite会写一个部分缓冲区,
我不会指望那个.所以我检查了部分写入,添加
并打破了循环.结束以下计划
(减少到MCVE):

#include <stdio.h>
#include <string.h>

//#define BUF_SIZE 4096
#define BUF_SIZE 8192
//#define BUF_SIZE 16384

int main(void)
{
    unsigned long long ct = 0;
    size_t written;
    unsigned char *buf;

    buf = malloc(BUF_SIZE);
    memset(buf, 0xFF, BUF_SIZE);

    while (1) {
        written = fwrite(buf, 1, BUF_SIZE, stdout);
        if (written < BUF_SIZE) {
            ct += written;
            break;
        }
        fflush(stdout);
        if (ferror(stdout))
            break;
        ct += written;
    }

    fprintf(stderr, "%llu bytes written\n", ct);

    return 0;
}

该设备有4k块,免费68k或72k.我试过缓冲区
尺寸为4k,8k和16k.

而且这件事仍然无效.什么时候有72k免费和我
使用8k缓冲区,写入72k,然后认为它写了另一个4k和
补充说.

我想我可以使用一个等于块大小的缓冲区大小.
但我甚至不确定它能否可靠地运作.

有谁知道如何让它在所有情况下都有效?我想它可能会
最好完全绕过缓冲问题并使用POSIX I / O.
相反(开放和写).

编辑:nsilent22的建议工作正常并减少
循环到两行:

    setbuf(stdout, NULL);
    ...
    while ((written = fwrite(buf, 1, BUF_SIZE, stdout)) > 0)
        ct += written;
最佳答案
考虑使用带有NULL参数的setbuf函数作为缓冲区.它将关闭流缓冲.

转载注明原文:当磁盘已满时,可靠地计算由fwrite写入的字节数 - 代码日志