Хранить токены в массиве - PullRequest
0 голосов
/ 13 февраля 2012

Новичок в C ++, я пытаюсь создать программу статистики для практики кодирования.Я надеюсь получить текстовый файл, прочитать его и сохранить значения в массивах, на которых я могу выполнять математические операции.я застрял здесь

 main ()
 {
      char output[100];
      char *charptr;
      int age[100];
      ifstream inFile;
      inFile.open("data.txt");
      if(!inFile)
      {
            cout<<"didn't work";
            cin.get();
            exit (1);
      }

      inFile.getline(output,100);
      charptr = strtok(output," ");
      for (int x=0;x<105;x++)
      {
           age[x] = atoi(charptr);
           cout<<*age<<endl;

      }

     cin.get();
}

в приведенном выше коде, я пытаюсь сохранить возраст субъекта в массиве int 'age', сохраняя возраст в первой строке файла.Я намерен использовать strtok, как уже упоминалось, но я не могу преобразовать токены в массив.

Как вы, очевидно, видите, я полный нуб, пожалуйста, потерпите меня, поскольку я учусь этому самостоятельно.:)

Спасибо

PS: Я читал похожие темы, но не могу следовать приведенному там подробному коду.

1 Ответ

5 голосов
/ 13 февраля 2012

Есть несколько проблем с циклом for:

  • Возможность выхода из-за пределов из-за age, имеющего 100 элементов, но условие завершения в цикле for равно x < 105
  • Нет проверки на charptr NULL перед использованием
  • Нет последующего вызова strtok() внутри for loop
  • Неправильная печать элементов age

Ниже приведен пример исправления цикла for:

charptr = strtok(output, " ");
int x = 0;
while (charptr && x < sizeof(age)/sizeof(age[0]))
{
    age[x] = atoi(charptr);
    cout << age[x] << endl;
    charptr = strtok(NULL, " ");
    x++;
}

Поскольку это C ++, предложите:

  • с использованием std::vector<int> вместо массива фиксированного размера
  • используйте std::getline(), чтобы избежать указания буфера фиксированного размера для чтения строки
  • используйте std::copy() с istream_iterator для анализа строки целых чисел

Например:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

int main ()
{
    std::vector<int> ages;
    std::ifstream inFile;
    inFile.open("data.txt");
    if(!inFile)
    {
        std::cout<<"didn't work";
        std::cin.get();
        exit (1);
    }

    std::string line;
    std::getline(inFile, line);

    std::istringstream in(line);

    std::copy(std::istream_iterator<int>(in),
              std::istream_iterator<int>(),
              std::back_inserter(ages));

    return 0;
}
...