2015-11-29 8 views
0

Я пытаюсь реализовать дерево AVL, используя пары ключ/значение из текстового файла. Например, (0003 099390, Vegas) будет одной такой ключевой парой значений, а 0003 - ключом, а 09390 - Вегасом. Я смущен тем, как извлекать каждый отдельный элемент. Я бы хотел, чтобы 0003, 09390 и Vegas хранились как каждая отдельная переменная в структуре.Реализация дерева AVL с использованием значений из текстового файла

+0

Если ваш текстовый файл имеет хорошо структурированные данные (выглядит так), полезно научиться читать с помощью 'scanf'. Если его достаточно просто, 'cin/getline' будет выполнять эту работу. – VillasV

+0

@VillasV Я не рекомендую использовать 'scanf'. 'std :: getline' и' stringstream' - лучшее решение. – erip

+0

@erip yes, другие пользователи SO закричали мне уже за рекомендацию 'scanf' для новых пользователей. Я не вижу ничего плохого, хотя это очень хорошо для структурированных данных. Я бы рекомендовал, чтобы данные были недостаточно структурированы. – VillasV

ответ

0

Я рекомендую использовать структуру для хранения значений:

struct Values 
{ 
    std::string value; // such as 09390 
    std::string city; // such as "Vegas" 
}; 

Далее, перегрузить оператор извлечения:

struct Values 
{ 
    std::string value; // such as 09390 
    std::string city; // such as "Vegas" 
    friend std::istream& operator>>(std::istream& inp, Values& v); 
}; 

std::istream& operator>>(std::istream& inp, Values& v) 
{ 
    inp >> v.value; 
    // insert code to skip over delimiter. 
    inp >> v.city; 
    return inp; 
} 

Ваш входной контур может выглядеть следующим образом:

std::string key; 
std::string delimiter; 
Values v; 
AVL tree; 
//... 
while (input_file >> key >> delimiter >> v) 
{ 
    tree[key] = v; 
} 

Примечание: вышеупомянутое входное выражение работает только тогда, когда значения не пробел или табуляция.

Для получения дополнительной информации о чтении из файла, поиск StackOverflow для:

  • "C++ прочитать файл-структуру"
  • "C++ прочитать файл CSV"
+0

К сожалению, чтение 'std :: string' рассматривает пробелы как разделители. Таким образом, чтение «ключа» будет читать все. –

+0

Да, я собирался записать записку об этом. Это работает, когда элементы не разделяются пробелами. –

0

Самый простой подход, вероятно, для использования ignore() в сочетании с std::getline():

std::string key, code, city; 
if (in.ignore(std::numeric_limits<std::streamsize>::max(), '(') 
    && std::getline(in, key, ',') 
    && std::getline(in, code, ',') 
    && std::getline(in, city, ')')) { 
    // ... 
} 
Смежные вопросы