C ++ Файл ввода / вывода - PullRequest
1 голос
/ 01 мая 2010

Я пытаюсь читать из файла, используя fgets и sscanf.В моем файле в каждой строке времени есть символы, которые я хочу поместить в вектор.Пока у меня есть следующее:

FILE *fp;
  fp = fopen(filename, "r");
  if(!fp)
  {
    fprintf(stderr, "Unable to open file %s\n", filename);
    return 0;
  }
  // Read file
  int line_count = 0;
  char buffer[1024];
  while(fgets(buffer, 1023, fp))
  {
    // Increment line counter
    line_count++;

    char *bufferp = buffer;

    ...

    while(*bufferp != '\n')
    {
      char *tmp;
      if(sscanf(bufferp, "%c", tmp) != 1)
      {
        fprintf(stderr, "Syntax error reading axiom on "
                "line %d in file %s\n", line_count, filename);
        return 0;
      }

      axiom.push_back(tmp);
      printf("put %s in axiom vector\n", axiom[axiom.size()-1]);

      // increment buffer pointer
      bufferp++;
    }
  }

мой аксиомный вектор определен как vector<char *> axiom;.Когда я запускаю свою программу, я получаю ошибку сегмента.Это происходит, когда я делаю sscanf.Любые предложения о том, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Более безопасный подход - использовать std::string и std::vector<std::string>.

Тип string управляет выделением памяти для вашего текста. Смотрите также getline и std::string::c_str().

2 голосов
/ 01 мая 2010

tmp - это указатель, а не массив, поэтому чтение его приводит к переполнению буфера.

для начала вы должны изменить значение tmp на:

  char *tmp = malloc(SOME_MAXIMUM_SIZE * sizeof(char));

и тогда вы должны не забыть освободить все указатели в axioms, когда вы закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...