0

我在将大量数据保存到 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

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

有人可以告诉为什么会出现此问题以及如何将其删除。我需要我的应用程序非常快,我想产生调试符号会减慢它的速度。

4

1 回答 1

1

问题在这里:

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

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

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

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

我会这样修复它:

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

你真的应该检查那个“测试”返回值。

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

于 2015-06-26T19:34:07.110 回答