2016-08-01 4 views
0

У меня возникли проблемы с кодированием и концептуализацией этого проекта, который мне был назначен. Я искал ответы на эту проблему, но мне не повезло, может быть, это действительно очевидно. Я должен предложить пользователь имя файла, файл предполагает иметь следующий формат:Чтение определенных слов из файла и их хранение в объекте

животные:

Имя: [значение]

шум: [значение]

Ноги: [значение]

(без пробелов между ними)

Он должен быть в состоянии читать как можно больше «объектов животного» как есть в файле и сохранить их в класс животных, который имеет 3 параметра (имя, шум, ноги).

Моя проблема в основном во время чтения файла, я не могу найти хороший способ для чтения файла и хранения информации. Вот код, который у меня есть. Любая помощь с кодом, который у меня есть, и идеи для хранения значений. Извините, если я ничего плохо объяснил, пожалуйста, попросите уточнить, сделал ли я, спасибо заранее.

cout << "Enter the file name: "; 
    string fileName; 
    getline(cin, fileName); 
    cout << endl; 
    try 
    { 
     ifstream animalFile(fileName); 
     if (!animalFile.good()) // if it's no good, let the user know and let the loop continue to try again 
     { 
      cout << "There was a problem with the file " << fileName << endl << endl; 
      continue; 
     } 

     string line; 
     while (animalFile >> line) // To get you all the lines. 
     { 
      getline(animalFile, line); // Saves the line in STRING. 
      cout << line << endl; // Prints our STRING. 
     } 

    } 
    catch (...) 
    { 
     cout << "There was a problem with the file " << fileName << endl << endl; 
    } 
+0

Действительно ли разумно изобретать колесо в этом случае? Подумайте об использовании существующих библиотек для xml, json, yaml или чего-нибудь еще. – alexeykuzmin0

ответ

0

Если вы действительно переплетены с этим форматом файла, сделайте следующее для чтения данных и хранить:

# 1. Определение класса Animal представлять животное:

struct Animal 
{ 
    std::string name; 
    int legs; 
    int noise; 
} 

# 2. Определите istream& operator >> (istream&, Animal&), чтобы прочитать один объект этого типа и проверить правильность ввода.

std::istream& operator >> (std::istream& lhs, Animal& rhs) 
{ 
    std::string buf; 
    lhs >> buf >> buf >> rhs.name >> buf >> rhs.noise >> buf >> rhs.legs; 
} 

# 3. Используйте std::copy и std::istream_iterator читать все значения из файла std::vector:

std::istream_iterator<Animal> eos; 
std::istream_iterator<Animal> bos(animalFile); 
std::vector<Animal> zoo; 
std::copy(bos, eos, std::back_inserter(zoo)); 

Этого код не имеет проверок для входных ошибок, которые могут быть легко добавлены в istream& operator >> (istream&, Animal&).

+0

Благодарим вас за ответ. Итак, для пояснения, № 2 просто читает файл для проверки формата, ничего другого? Также для №3 вы могли бы дать мне объяснение того, что делает линия кода, у меня проблемы с ее полным пониманием, даже зная, что она должна делать. – Roberto

+0

@Roberto # 2 фактически считывает данные и возвращает их, сохраняя в выходном аргументе 'rhs'. Этот оператор можно использовать следующим образом: «Animal a; cin >> a; '. – alexeykuzmin0

+0

# 3: 'std :: vector' - это просто динамический массив' Animal's. 'istream_iterator ' является итератором над 'istream'. При разыменовании возвращается значение типа 'T', считанное из' istream', заданное 'operator >>', при его продвижении переходит к следующему элементу типа 'T' в' istream'. 'istream_iterator', построенный без аргументов, - это« итератор конца потока »- он имеет неправильное состояние и равен (в терминах' operator == ') для' istream_iterator' продвинутым, пока не достигнет конца потока. 'std :: back_inserter' является' std :: back_intert_iterator', который выполняет 'push_back()' при назначении. – alexeykuzmin0