C++ 分段冲突:while(fgets(buffer,15,statfile)!=NULL){};

C++ 分段冲突:while(fgets(buffer,15,statfile)!=NULL){};,c++,segmentation-fault,fgets,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::string

如果按顺序寻址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;
}
intfsize(intr,双VME,std::string*filepath){
文件*statfile;
std::stringstream文件名;
std::stringstream命令;
字符串*文件名=新字符串;
std::string命令;
字符缓冲区[15];
炭粒大小;
streamfilename.str(“”);

streamfilename
statFile
可能是
NULL

如果你想得到文件化,你应该考虑C函数:

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

避免命令的克隆和解析结果。

是STATFILE有效吗?此外…为什么混合C和C++?如果检查PONEN(的返回值)你可能会看到它失败了。statfile将为NULL,这是你的毁灭之路。阿德里亚诺:你能更具体地介绍一下C吗?我不知道你指的是什么。你也在泄漏
文件大小
文件名
。你的代码有两次出现
new
(没有充分的理由)这三行代码:
int*filesize=new int;*filesize=atoi(buffer);return*filesize;
只能替换为一行:
return atoi(buffer)
。如果这件事你想不起来,你应该花点时间来学习。我不是在评判任何人,这件事很难学,但在用C/C++编程时它是必不可少的。