使用fwrite而不调用fflush或先写入stderr

时间:2013-06-28 13:15:40

标签: c fwrite stderr printf fflush

我有一个将二进制数据写入文件或stdout的函数。但是,fwrite()的来电有时会失败,除非我fflush(stderr)或在尝试stderr之前向fwrite打印报告。

这是正常行为,还是指示某些潜在的内存问题?调试很困难,因为只要我fprint stderr我想要fwritestdout的数据,“问题”就会消失。

这是该函数的一个非常简化的版本。

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);
}

任何智慧都赞赏:)

1 个答案:

答案 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);
}
  1. ntowrite s / b size_t,无符号整数。 ntowrite = 0可能会导致m混淆。 ntowrite&lt; 0 导致问题。
  2. m未声明,假设为size_t。
  3. 格式“数据[%d] =%g \ n”s / b“数据[%ld] =%g \ n”
  4. 我s / b size_t。
  5. (size_t)(ntowrite*sizeof(double)) s / b ((size_t)ntowrite)*sizeof(double)。见#7。
  6. 不应该需要
  7. fprintf(stderr...。那是 问题。
  8. 即使fwrite(..., size, n ...)溢出,
  9. size * n也能正常工作。比OP更安全。