我有一个将二进制数据写入文件或stdout
的函数。但是,fwrite()
的来电有时会失败,除非我fflush(stderr)
或在尝试stderr
之前向fwrite
打印报告。
这是正常行为,还是指示某些潜在的内存问题?调试很困难,因为只要我fprint
stderr
我想要fwrite
到stdout
的数据,“问题”就会消失。
这是该函数的一个非常简化的版本。
int writebinary(FILE *fpout, void *data, long ntowrite) {
long i;
/* lets say we know the input data is double float */
double *p = data;
/* including this test line makes the function work! */
for(i=0; i<ntowrite;i++) fprintf(stderr,"data[%d]=%g\n",i,p[i]);
/* attempt to write data[] as a single block of bytes */
m= fwrite(data,(size_t)(ntowrite*sizeof(double)),1,fpout);
if(m!=1) {
fprintf(stderr,"Write error: %d\n",ferror(fpout));
return(-1);
}
else return(m);
}
任何智慧都赞赏:)
答案 0 :(得分:0)
这不是正常行为 推荐以下内容。帖子中有很多内容值得关注(见下文),但没有指出问题 - 但某些内容是错误的。
int writebinary2(FILE *fpout, void *data, long ntowrite) {
size_t n = (size_t) ntowrite;
double *dp = (double *) data;
// pedantic checks
if ((!fpout) || (!data) || (dp != data) || (ntowrite <= 0) || (n != ntowrite)) {
fprintf(stderr,"Bad parameter\n");
return(0);
}
clearerr(stderr); // only needed for debug
clearerr(fpout);
/* attempt to write blocks of doubles */
size_t m = fwrite(dp, sizeof(double), n, fpout);
if (m != n) {
fprintf(stderr,"Write error: %d\n",ferror(fpout));
clearerr(fpout);
return(-1);
}
if (fflush(fpout)) {
fprintf(stderr,"Flush error: %d\n",ferror(fpout));
clearerr(fpout);
return(-1);
}
return(1);
}
(size_t)(ntowrite*sizeof(double))
s / b ((size_t)ntowrite)*sizeof(double)
。见#7。fprintf(stderr...
。那是 问题。fwrite(..., size, n ...)
溢出,size * n
也能正常工作。比OP更安全。