Данные файла считываются на карту, но map :: find () не работает - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно найти пару ключ / значение на карте, но из-за того, как карта заполнена, по какой-то причине map::find() не работает.

Данные, с которых он читает, можно свести к

Key1,a,b,c
Key2,a
Key3
Key4,a,b

С этим я мог бы распечатать все эти данные, используя цикл итератора, но map::find() не работает с Key3 или Key4.

Данные собираются из файла как таковые:

file.open("input.txt");
std::string line;
std::string key;
while(getline(file,line,','))
{
    key = line;
    getline(file,line);
    m[key]=line;
}

Который может быть напечатан с:

for(auto it = m.begin(); it != m.end(); ++it)
{
    std::cout<<it->first<<","<<it->second<<std::endl;
}

Выход:

Key1,a,b,c
Key2,a
Key3
Key4,a,b

Но по какой-то причине Key3 и Key4 не существуют согласно map::find().

Я попытался проверить биты ошибок, вручную установив значение для Key3, кажется, ничего не работает, что позволяет мне использовать map::find() для значений после Key3. (map :: find () возвращает map.end () для этих значений)

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

while (getline (file, line, ','))

В строке выше ищется разделитель ','.Однако, поскольку строка 3 в вашем файле не имеет ',' она эффективно читает [Key3 \ nKey4] в качестве ключа.

Отсюда и ошибка.

Поскольку вы не можете изменить файл, я бы посоветовал прочитать всю строку с разделителем по умолчанию '\ n', а затем проанализировать заполненную строку.

Просто чтобы заметить, однако, вам понадобится значение часового ключа для Key3, если вы хотите, чтобы оно существовало на карте, или используйте функцию-член map :: count () для проверки существования.

0 голосов
/ 20 апреля 2019

Так что, хотя это не объясняет, в чем была изначальная проблема, вот решение, которое я нашел.

Сбор данных из файла теперь

file.open("input.txt");
std::string line;
std::string key;
std::stringstream ss;
while(getline(file,line,'\n'))
{
    ss << line;
    getline(ss,line,',');
    key = line;
    getline(ss,line,'\n');
    m[key] = line;
    ss.clear();
}

Получение данных из файлаэтот способ гарантирует, что данные теперь правильно читаются, любезно предоставлено пользователем 3389943

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