有没有人知道一种可靠的方法来计算实际有多少字节
在磁盘已满的情况下使用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函数作为缓冲区.它将关闭流缓冲.