Нарушение сегментации: while (fgets (buffer, 15, statfile)! = NULL) {};

0

Этот код работает для нескольких тысяч вызовов в строке, если 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;
}

В чем причина ошибки сегментации?

  • 0
    Действует ли statfile? Более того ... зачем смешивать C и C ++?
  • 0
    Если вы проверите возвращаемое значение popen (), вы, скорее всего, увидите, что оно не удалось. statfile будет NULL, и это ваш путь к краху.
Показать ещё 8 комментариев
Теги:
segmentation-fault
fgets

1 ответ

1
Лучший ответ

statFile, вероятно, NULL.

Если вы хотите получить размер файла, вы должны рассмотреть функцию C:

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

Это позволит избежать разветвления команды и анализа ее результата.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню