【问题标题】:C++ fwrite , ferror code 36 Broken PipieC++ fwrite,错误代码 36 断管
【发布时间】:2015-06-26 19:20:32
【问题描述】:

我在将大量数据保存到 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 配置文件编译和运行它时,它运行良好,而当从 release 运行时,它会抛出错误 num 32 Broken Pipe

我去构建选项,似乎产生调试符号会产生差异,当它在文件上时写入是成功的,如果它关闭我会损坏管道。

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

【问题讨论】:

  • 可能不相关,但您写入的数据过多。 fwrite(tablica,sizeof(long),sizeof(tablica),pFile); 表示写入 sizeof(long)(可能是 4 或 8 个字节)sizeof(tablica)(10000 * 4 或 8)次。

标签: c++ codeblocks fwrite broken-pipe ferror


【解决方案1】:

问题出在这里:

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

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

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

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

我会这样修复它:

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

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

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

【讨论】:

  • 我,我将它翻转 fwrite(tablica,sizeof(tablica), 1, pFile); 并测试返回值是否为 1
  • 是的,不管怎样,虽然我认为知道写入了多少字节更有用。同样,您不一定要让运行时尝试将整个事情吞下一大口,可以这么说。
  • 同意。如果目标是 PC,我会选择每次写入 4k 以符合最常见的集群大小。
  • 好吧,为什么我确实认为 fwrite 的第三个参数是数组的总大小而不是数组计数,我不知道。是的,我会检查它是否仍在进行中,感谢您的帮助
  • 另一种选择是fwrite(tablica,sizeof(long),sizeof(tablica)/sizeof(long),pFile),或者,如果您想更改tablica 的实现,请使用fwrite(tablica,sizeof(tablica[0]),sizeof(tablica)/sizeof(tablica[0]),pFile)
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2023-03-31
相关资源
最近更新 更多