Во-первых, вы должны определить (по крайней мере, на бумаге или в комментариях) точно формат вашего файла, возможно, через EBNF обозначение. Пример никогда не бывает достаточным (и лучше, кроме документации формата, дает конкретный конкретный пример, а не абстрактные). Если файл создается другим программным обеспечением, это программное обеспечение должно документировать формат.
Вам необходимо прочитать файл строки за строкой (например, используя std::getline) и, возможно, полностью (или, по крайней мере, до тех пор, пока вы не получите всю необходимую информацию). Вы можете использовать стандартные методы lexing и parsing (возможно, на каждой строке, возможно, на весь файл в целом). Вы могли (по крайней мере, если файл не очень большой) заполнить некоторые данные в памяти.
Если файл действительно большой (например, гигабайт, который не подходит в ОЗУ), вы можете прочитать его дважды. В первый раз для вычисления смещений (используя tellg) соответствующих строк (или блоков данных), например. в некоторый std::map
, и во второй раз использовать seekg для чтения частей этого файла.
Если вы можете изменить формат файла, вы могли бы рассмотреть возможность использования стандартных форматов текстовой сериализации как JSON (который имеет несколько C++ библиотеки работы с ней, например, JSONCPP) или YAML (я не рекомендую XML, если он не является внешнее требование, поскольку XML слишком сложный и слишком многословный). Вы также можете рассмотреть подход к базе данных, возможно, так же просто, как Sqlite.
sir, файл находится около '10MB' – highlander141
10MB очень легко вписывается в оперативную память (если ваш компьютер не является дешевым встроенным микроконтроллером), по крайней мере, на настольных компьютерах, ноутбуках и планшетах. –
да так 'getline' будет достаточно, и, читая каждую строку, я просто использую' std :: find' для этих двух разделителей и 'std :: vector' для' push_back' эти строки? – highlander141