分段违规:while(fgets(buffer,15,statfile)!= NULL){};

时间:2014-01-04 18:45:13

标签: c++ segmentation-fault fgets

如果r是按顺序寻址的,则此代码可以连续进行数千次调用。如果r是随机选择的,它可以连续运行几百个。

然而,在随机r的某个时刻,我得到了分段违规。我不确定是什么导致这种情况,因为它几乎在所有时间都能正常工作。

*** Break *** segmentation violation
Segmentation fault

崩溃发生在fgets。

int fsize(int r, double VME, std::string* filepath) {
  FILE *statfile;
  std::stringstream streamfilename;
  std::stringstream streamcommand;
  string* filename = new string;
  std::string command;
  char buffer [15];
  char charsize;
  streamfilename.str("");
  streamfilename << *filepath << "run" << r << "-" << VME << ".dat";
  *filename = streamfilename.str();
  streamcommand.str("");
  streamcommand << "stat -c " << "%s " << *filename;
  command = streamcommand.str();
  const char * charcommand = command.c_str();
  statfile = popen(charcommand, "r");
  cout << "Test 5\n";
  while(fgets(buffer,15,statfile)!=NULL){}; CRASH OCCURS HERE
  cout << "Test 6\n";
  int* filesize = new int;
  *filesize = atoi(buffer);
  pclose(statfile);
  return *filesize;
}

分段错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

statFile可能是NULL

如果你想获得文件大小,你应该考虑C函数:

 int stat(const char *path, struct stat *buf);

它将避免分叉命令并解析其结果。