Разграничение входного файла двумя разделителями - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно прочитать файл, где первый символ в строке - это имя объекта, а второй символ (разделенный пробелом) - это данные для этого объекта.

Мне было интереснокак читать (в C ++) каждый из этих фрагментов данных в разные векторы один за другим.

1 Ответ

0 голосов
/ 10 декабря 2018

Тебе повезло, у меня настроение написания кода ...

Получение строк строка за строкой:

std::ifstream file(path);
if(file) // opened successfully?
{
    std::string line;
    while(std::getline(file, line))
    {
        // use line
    }
    if(file.eof())
    {
        // entire file read, file was OK
    }
    else
    {
        // some error occured! need appropriate handling
    }
}

Разделение строк:

std::string s   = "hello   world";
auto keyEnd     = std::find_if(s.begin(), s.end(), isspace);
auto valueBegin = std::find_if(i, s.end(), isalnum);

std::string key(s.begin(), keyEnd);
std::string value(valueBegin, s.end());

Теперь вы можете проверить и ключ, и значение для правильного формата, например, оба содержат ровно один символ, и отклонить файл, если он недействителен ...

Два вектора?Вы могли бы push_back и ключ и значение, но, возможно, std::map<std::string, std::string> (или std::unordered_map) - лучший выбор?Или даже std::vector<std::pair<std::string, std::string>>?Все они имеют преимущество в том, что они хранят ключ и значение вместе и будут более уместными, если вы не собираетесь поддерживать оба независимо (например, сортировка ключей, в то время как значения могут / должны сохранять первоначальный порядок).

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