C语言 释放内存优雅方式,c++ - 在C语言中优雅的二进制I / O? - 堆栈内存溢出

对于这个问题,我见过的最优雅的解决方案是肖恩·巴雷特(Sean Barrett)的writefv ,用于他的微型图像编写库stb_image_write 在此处可用)。 他只实现了几个原语(并且没有错误处理),但是相同的方法可以扩展到基本上是二进制的printf (对于读取,您可以执行相同的操作以获得二进制的scanf )。 非常优雅整洁! 实际上,整个过程是如此简单,我不妨将其包含在此处:

static void writefv(FILE *f, const char *fmt, va_list v)

{

while (*fmt) {

switch (*fmt++) {

case ' ': break;

case '1': { unsigned char x = (unsigned char) va_arg(v, int); fputc(x,f); break; }

case '2': { int x = va_arg(v,int); unsigned char b[2];

b[0] = (unsigned char) x; b[1] = (unsigned char) (x>>8);

fwrite(b,2,1,f); break; }

case '4': { stbiw_uint32 x = va_arg(v,int); unsigned char b[4];

b[0]=(unsigned char)x; b[1]=(unsigned char)(x>>8);

b[2]=(unsigned char)(x>>16); b[3]=(unsigned char)(x>>24);

fwrite(b,4,1,f); break; }

default:

assert(0);

return;

}

}

}

这是他使用它编写truecolor .BMP文件的方式:

static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, const char *fmt, ...)

{

FILE *f;

if (y < 0 || x < 0) return 0;

f = fopen(filename, "wb");

if (f) {

va_list v;

va_start(v, fmt);

writefv(f, fmt, v);

va_end(v);

write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad);

fclose(f);

}

return f != NULL;

}

int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)

{

int pad = (-x*3) & 3;

return outfile(filename,-1,-1,x,y,comp,(void *) data,0,pad,

"11 4 22 4" "4 44 22 444444",

'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header

40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header

}

(由于这里的切线很切, write_pixels省略了write_pixels定义)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值