2015-07-07 3 views
-1

У меня есть текстовый файл в следующем формате:Прочитайте определенную часть текстового файла в C++ (между двумя разделителями)

UserIP-Address-1 UserInfo-1 UserInfo-2 UserInfo-3 UserIP-Address-1_ENDS UserIP-Address-2 UserInfo-1 UserInfo-2 UserInfo-3 UserIP-Address-2-ENDS

Мне нужно собрать информацию согласно запросу клиента и отправить данные между этими двумя разделителями UserIP-Address-1 и UserIP-Address-1_ENDS. Я могу найти один из разделителей, используя find или vector::iterator, но как найти другой конец и данные между ними? Пожалуйста, направляйте меня, спасибо вам всем.

ответ

1

Во-первых, вы должны определить (по крайней мере, на бумаге или в комментариях) точно формат вашего файла, возможно, через EBNF обозначение. Пример никогда не бывает достаточным (и лучше, кроме документации формата, дает конкретный конкретный пример, а не абстрактные). Если файл создается другим программным обеспечением, это программное обеспечение должно документировать формат.

Вам необходимо прочитать файл строки за строкой (например, используя std::getline) и, возможно, полностью (или, по крайней мере, до тех пор, пока вы не получите всю необходимую информацию). Вы можете использовать стандартные методы lexing и parsing (возможно, на каждой строке, возможно, на весь файл в целом). Вы могли (по крайней мере, если файл не очень большой) заполнить некоторые данные в памяти.

Если файл действительно большой (например, гигабайт, который не подходит в ОЗУ), вы можете прочитать его дважды. В первый раз для вычисления смещений (используя tellg) соответствующих строк (или блоков данных), например. в некоторый std::map, и во второй раз использовать seekg для чтения частей этого файла.

Если вы можете изменить формат файла, вы могли бы рассмотреть возможность использования стандартных форматов текстовой сериализации как JSON (который имеет несколько C++ библиотеки работы с ней, например, JSONCPP) или YAML (я не рекомендую XML, если он не является внешнее требование, поскольку XML слишком сложный и слишком многословный). Вы также можете рассмотреть подход к базе данных, возможно, так же просто, как Sqlite.

+0

sir, файл находится около '10MB' – highlander141

+0

10MB очень легко вписывается в оперативную память (если ваш компьютер не является дешевым встроенным микроконтроллером), по крайней мере, на настольных компьютерах, ноутбуках и планшетах. –

+0

да так 'getline' будет достаточно, и, читая каждую строку, я просто использую' std :: find' для этих двух разделителей и 'std :: vector' для' push_back' эти строки? – highlander141

Смежные вопросы