Пропуск текста при чтении файлов в C ++ - PullRequest
0 голосов
/ 25 сентября 2011

Я студент начального уровня C ++ и работаю с данными из внешних файлов.Я пытаюсь хэшировать определенную информацию из больших объемов данных, которые мне нужно пропустить.Я знаю, какой текст я буду искать.Как бы я написал функцию, которая пропускает определенное количество символов в файле / строке, или такая вещь уже существует в iostream или что-то подобное?Google подвел меня до сих пор.

Ответы [ 2 ]

3 голосов
/ 25 сентября 2011

При общем пропуске: seekg

По реальной проблеме:

Похоже, вы хотите сопоставить шаблоны с большим массивом (полу?)текст.Поскольку шаблон достаточно длинный, чтобы его можно было получить, пропуская входные отрезки, действительно кажется, что вы пытаетесь изобрести оптимизированный поиск по всей строке.

Это было сделано:

Реализации существуют в дикой природе (я предполагаю, что BoostСтроковый алгоритм должен иметь его ... но, может быть, он слишком универсален, чтобы иметь его. Я бы посмотрел в любом случае)

PS .: Boost Spirit

Этот анализатор в настоящее время просматриваетрасширение, которое реализует директиву qi::seek[]:

Это позволяет невероятно быстро пропускать внутри грамматики Spirit.Так что если у вас есть дело с полным анализатором (возможно, даже сканером / анализатором), Spirit Qi действительно может быть вашим соответствием в производительности.

Обязательно:

  • избегайте буферизации вводаадаптеры итераторов, если вы можете (зависит от грамматики)
  • наполнить локаль "C", если вы можете
  • работать с итераторами входного потока в отличие от итераторов входных потоков
1 голос
/ 25 сентября 2011
#include <iostream>
#include <string>
using std::ifstream;
using std::string;
using std::getline;

ifstream ifs(filename);
if ( ! ifs ) {
    /* ERROR CODE IN HERE */
}

string line;
while ( getline(ifs, line) )
{
    // line now contains one line from the input file
    if ( /* want to skip */ ) {
        continue;
    }

    /* Do something with the line */
}

edit: некоторые из предикатов строки повышения (start_with, end_with) могут быть полезны для этого условия внутри цикла while.Например, если вы хотите обрабатывать только строки, начинающиеся с 'FOO', вы должны написать

#include <boost/algorithm/string/predicate.hpp>
using boost::starts_with;

while ( getline(ifs,line) )
{
    if ( starts_with(line, "FOO") ) {
        /* DO SOMETHING */
    }
}

http://www.boost.org/doc/libs/1_41_0/doc/html/string_algo.html

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