Найти и извлечь данные из текстового файла - PullRequest
0 голосов
/ 22 февраля 2012

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

Это образец текстового файла:

Relay States
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

В идеале, я бы хотел позвонить LoadData<bool> something.LoadData("Relay States"); и вернуть std :: vector с {0,0,0,0,0,0,0,0, ...}.

template<typename T> std::vector<T> CProfile::LoadData(const std::string& name)
{
    std::ifstream ifs(FILE_NAME);
    std::vector<T> data;
    std::istreambuf_iterator<char> iit = std::istreambuf_iterator<char>(ifs);

    std::search(iit, ifs.eof(), name.begin(), name.end());
    std::advance(iit, name.size() + 1);

    T buffer = 0;
    for(ifs.seekg(iit); ifs.peek() != '\n' && !ifs.eof(); data.push_back(ifs))
    {
        ifs >> buffer;
        data.push_back(buffer);
    }

    return data;
}

Из того, что я понимаю, основные проблемы с моим кодом:

  • std :: search - это неоднозначный вызов, как мне исправить это?
  • Если ifs.seekg (iit) не разрешен законом, как мне сделать так, чтобы аргумент iit был действительным?

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Как насчет этого:

template<typename T> std::vector<T> CProfile::RealLoadData(std::istream &is)
{
    std::string line;
    std::vector<T> data;

    while (std::getline(is, line))
    {
        if (line.empty())
            break;  // Empty line, end of data

        std::istringstream iss(line);

        T temp;
        while (iss >> temp)
            data.push_back(temp);
    }

    return data;
}

template<typename T> std::vector<T> CProfile::LoadData(const std::string& name)
{
    std::string line;
    std::ifstream ifs(FILE_NAME);

    while (std::getline(ifs, line))
    {
        if (line == name)
        {
            // Found the section, now get the actual data
            return RealLoadData<T>(ifs);
        }
    }

    // Section not found, return an empty vector
    return std::vector<T>();
}
1 голос
/ 22 февраля 2012

Ну, я думаю, что ваши аргументы в std :: search - проблема

std::search(iit, ifs.eof(), name.begin(), name.end());

должно быть

std::search(iit, std::istreambuf_iterator<char>(), name.begin(), name.end());

как для строки: ifs.seekg(iit) в цикле for не годится, так как seekg ожидает некоторое смещение типа streampos, а не итератор. так должно быть ifs.seekg(0)

...