C++ fwrite , ferror code 36 Broken Pipie

C++ fwrite , ferror code 36 Broken Pipie

本文关键字:Broken Pipie code ferror fwrite C++      更新时间:2023-10-16

我在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;
}

它只是对大量数据进行rand,并将其保存到文件中。

奇怪的是,当从DEBUG概要文件编译和运行它时,它运行得很好,当从发行版运行时,它会清除错误num 32 Broken Pipe

我去构建选项,似乎Produce debbuging符号会产生差异,当它在文件上时,写入是成功的,如果它关闭,我会崩溃。

有人能告诉我为什么会出现这个问题,以及如何删除它吗?我需要我的应用程序非常快,我想产生去bug符号会减慢它的速度。

问题就在这里:

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

对数组调用sizeof会返回以字节为单位的数组大小,而不是元素数量,如下所述:如何确定C中数组的大小?

所以你是在告诉fwrite写40000长,而不是10000长。

它在调试模式下工作但未发布的原因可能是由于调试运行时中的检查。(虽然你没有指定你使用的平台/编译器/运行时,所以很难说。)

我会这样修复它:

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

您确实应该检查"测试"返回值。

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