двоичное дерево поиска — моей программе необходимо прочитать текстовый файл, данные в текстовом файле должны быть разделены запятыми (C ++)

Мне нужно вставить данные в поисковое двоичное дерево, читая текстовый файл. Это работает, когда я использую пробелы между данными, но не работает, если я использую запятые, как я хочу.
Например, я бы хотел, чтобы мой текстовый файл выглядел так:

New-York,c3,Luke
London,c5,Nathan
Toronto,c1,Jacob
...

Мой текстовый файл сейчас выглядит примерно так:

New-York c3 Luke
London c5 Nathan
Toronto c1 Jacob
...

Я также хотел бы, чтобы моя программа не считала пробел, значит, она должна смотреть на следующие данные, только с запятыми.

Вот как выглядит мой код:

void fillTree( BinarySearchTree *b)
{
ifstream file;
file.open("data.txt");
string city;
string tag;
string name;
Person p;

if(!file) {
cout<<"Error. " << endl;
}

while(file >> city >> tag >> name)
{
p.setCity(city);
p.setTag(tag);
p.setName(name);
cout << p.getCity() << " " << p.getTag() << " " << p.getName() << endl;
(*b).insert(p);
}
file.close();
}

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

1

Решение

использование getline ( file, value, ',' ); читать строку, пока не произойдет кома.

string value;
while(file.good())
{
getline ( file, value, ',' );
p.setCity(value);
getline ( file, value, ',' );
p.setTag(value);
getline ( file, value, ',' );
p.setName(value);
cout << p.getCity() << " " << p.getTag() << " " << p.getName() << endl;
(*b).insert(p);
}
1

Другие решения

В C ++ вы можете переопределить то, что поток считает пробелом. Вы могли бы, например, изменить это, чтобы означать ',' а также '\n', Техника, чтобы сделать, это imbue() поток с std::locale с измененным std::ctype<char> фаска. Инфраструктура для аспекта выглядит немного сложной, но как только это произойдет, для чтения данных удобно использовать операторы ввода:

#include <locale>

template <char S0, char S1>
struct commactype_base {
commactype_base(): table_() {
std::transform(std::ctype<char>::classic_table(),
std::ctype<char>::classic_table() + std::ctype<char>::table_size,
this->table_,
[](std::ctype_base::mask m) -> std::ctype_base::mask {
return m & ~(std::ctype_base::space);
});
this->table_[static_cast<unsigned char>(S0)] |= std::ctype_base::space;
this->table_[static_cast<unsigned char>(S1)] |= std::ctype_base::space;
}
std::ctype<char>::mask table_[std::ctype<char>::table_size];
static std::ctype_base::mask clear_space(std::ctype_base::mask m) {
return m & ~(std::ctype_base::space);
}
};
template <char S0, char S1 = S0>
struct ctype:
commactype_base<S0, S1>,
std::ctype<char>
{
ctype(): std::ctype<char>(this->table_, false) {}
};

int main() {
std::ifstream in("somefile.txt");
in.imbue(std::locale(std::locale(), new ::ctype<',', '\n'>));
std::string v0, v1, v2;
while (in >> v0 >> v1 >> v2) {
std::cout << "v0='" << v0 << "' v1='" << v1 << "' v2='" << v2 << "'\n";
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector