C++ fwrite,错误代码 36 Broken Pipe

C++ fwrite , ferror code 36 Broken Pipie

我在用 C++ 将大量数据保存到二进制文件时遇到问题,我正在使用 CodeBlocks

我的代码:

long tablica[10000];
int main(int argc, char *argv[])
 {
  FILE * pFile;
  clock_t start,stop;
  srand (time(NULL));
  long i;
  for(i=0;i<10000;i++){
                 tablica[i] = rand() % 100000;
                 }
  start = clock();
  pFile = fopen ("myfile.bin","wb");
  if (pFile!=NULL)
   {
    long test = fwrite(tablica,sizeof(long),sizeof(tablica),pFile);
    int err = ferror(pFile);
    fclose(pFile);
    printf("%d",err);
   }
    double wynik;
    wynik = double(stop-start);
    printf("\n %f",wynik);
return 0;
}

它只是随机抽取大量数据,并将其保存到文件中。

奇怪的是,当从 DEBUG 配置文件编译和 运行 它时它运行良好,而当 运行 从发布时它显示错误 num 32 Broken Pipe

我去构建选项,似乎 Produce debugging symbols 产生了差异,当它在文件写入时是成功的,如果它关闭我得到 brokenpipe。

谁能告诉我为什么会出现这个问题以及如何解决这个问题。我需要我的应用程序非常快,我想生成调试符号会减慢它的速度。

问题出在这里:

long test = fwrite(tablica,sizeof(long),sizeof(tablica),pFile);

在数组上调用 sizeof returns 数组的大小(以字节为单位),而不是元素的数量,如下所述: How do I determine the size of my array in C?

所以你告诉 fwrite 写入 40000 个多头,而不是 10000 个多头。

它在调试模式下工作但在发布模式下不工作的原因可能是由于调试运行时检查。 (尽管您没有指定 platform/compiler/runtime 您使用的是什么,所以很难确定。)

我会这样修复:

long test = fwrite(tablica,1,sizeof(tablica),pFile);

你真的应该检查 "test" return 值。

此外,我不会尝试一次写入所有数据,而是在循环中进行一系列 fwrite 调用,一次写入一个千字节(1024 字节)。