Как парсить файл в c

Обновлено: 06.07.2024

Я бы просто создать класс, представляющий строку. Затем поток в этот объект:

Но приложив немного усилий, мы могли бы технически создать итератор:

Решение с использованием Boost токенизатор:

Моя версия не используя ничего, кроме стандартной библиотеки C++11. Он хорошо справляется с цитатой в Excel в формате CSV:

В C++ для струнного инструментария библиотека (StrTk) имеет знак решетки класс, который позволяет загрузить данные либо из <б>текстовых файлов, строк или char буфера</б> и анализировать/обрабатывать их в ряд-столбец моды.

Можно указать разделители строк и столбцов разделители или просто использовать по умолчанию.

Больше примеров можно найти здесь

Вы можете использовать импульс токенизатор с escaped_list_separator.

escaped_list_separator разбирает включает в КШМ. Наддува::токенизатор

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

Вот пример, (см. парсить CSV-файл с Boost токенизатор в C++ для повышения детали или :: токенизатор ):

Это не перебор, чтобы использовать дух для разбора CSV-файлов. Дух хорошо подходит для микро-анализа задачи. Например, с духом 2.1, это так же просто, как:

Учебник прогрессирует от простого к сложному. Файл CSV парсеров представлены где-то в середине и затрагивает различные методы В С помощью Духа. Сгенерированный код является так плотно, как написанных от руки код. Проверьте ассемблер автоматически!

Если вы не забота о парсинге в CSV правильно, это будет делать. относительно медленно, так как он работает один чар за раз.

При использовании наддува токенизатор сбежал\_list _separator для CSV-файлов, то следует помнить о следующем:

  1. Это требует Escape-символом (по умолчанию-слеш - \)
  2. Это требует сплиттер/разделитель-символ (запятая по умолчанию ,)
  3. Это требует цитата-персонаж (цитата по умолчанию - то ")

В формате CSV, указанных государствами-Вики, что поля данных могут содержать разделители в кавычках (поддерживается):

1997,Форд,Э350, то"супер, роскошный грузовик"и

Формат CSV, указанных государствами-Вики, что одинарные кавычки должны быть обработаны с двойными кавычками (сбежал\_list _separator будет отбрасывать все символы кавычек):

1997,Форд,Э350, то"Супер " и на"роскошных" и" и грузовик"и

  1. Сначала заменить все символы наклонной черты (\) с обратной косой черты ( \ \ \ \ ), чтобы они не отняли.
  2. Во-вторых заменить все двойные кавычки (" не то") С один обратный Слэш и кавычку (\")смотрите

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

Не очень, но это работает, как долго там не переводы строк внутри кавычек.

Из практического опыта сотрудника, который всегда успешно решает поставленные задачи.

Для работы с файлами Word и Excel я решил выбрать библиотеки Microsoft.Office.Interop.Word и Microsoft.Office.Interop.Excel, предоставляющие программные интерфейсы для взаимодействия с объектами MS Word и Excel.

Преимущества использования этих библиотек:

  • созданы корпорацией Microsoft, следовательно, взаимодействие с объектами программ пакета MS Office реализовано наиболее оптимально,
  • нужный пакет Visual Studio Tool for Office поставляется вместе с Visual Studio (достаточно отметить его при установке VS).

Также следует заметить, что у такого похода есть и недостаток: для того, чтобы написанная программа работала на ПК пользователя необходимо, чтобы на нём были установлены программы MS Office и MS Excel. Поэтому такой подход плохо подходит для серверных решений. Также такая программа не будет являться кроссплатформенной.

Добавление библиотек в проект Visual Studio

Для использования библиотеки нужно:

  • добавить ссылку на неё: в обозревателе решений необходимо кликнуть правой кнопкой мыши по пункту Ссылки (Рис. 1) и найти нужную библиотеку по ключевым словам (после добавления ссылка появится в списке),
  • указать используемое пространство имён в файле программы (в примере ему назначен алиас Word): (Рис. 2):

Можно прочитать основные форматы: .doc,. docx,. rtf.

Ниже приведён листинг с примером считывания текста из документа MS Word:

  • в коде приводится пример считывания основного текста документа, текста верхних и нижних колонтитулов, а также текста сносок,
  • в коде производится очистка неуправляемых ресурсов с использованием класса Marshal

Пример парсинга файла MS Excel

Можно прочитать основные форматы: .xls,. xlsx.

Ниже приведён листинг с примером считывания текста из документа MS Excel (по ячейкам):

  • при обработке текста каждой ячейки приходится заранее знать количество задействованных строк и столбцов на текущем листе документа,
  • такой перебор не совсем оптимален (временная сложность алгоритма O(n2)): при желании его можно ускорить (например, разбив обработку на несколько потоков): в данной статье приводится лишь пример получения текста из каждой ячейки,
  • при таком переборе ячеек необходимо на каждой итерации освобождать неуправляемые ресурсы, чтобы избежать утечек памяти (аналогично предыдущему примеру, используется класс Marshal).

С помощью указанных библиотек можно не только читать текст из документов, но и создавать новые файлы форматов MS Word и Excel.

Способ, описаннный в статье, очень медленный и требует установленных Word, Excel и т. д. Это очень частный случай для десктопного приложения. В случае вебсервера или мобильного приложения им пользоваться невозможно. (Сейчас увидел упоминание об этом в статье). Все современные x-форматы Office — это xml документы, описанные в спецификации OpenXML. Есть нативная библиотека от Microsoft для работы с документами в этом формате. Это сложный стандарт, описание занимает больше тысячи страниц. Люди написали обёртки над той библиотекой, с ними работать проще.
Про старые doc и xls советую забыть. ред.

В сегодняшнем выпуске Telegram-канала ForGeeks рассказываю, почему провалилась GTA: The Trilogy, зачем Facebook своя перчатка, будет ли у Samsung смартфон со стилусом и как в Spotify теперь петь караоке. Слушайте свежий выпуск, читайте и подписывайтесь.

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

Во-первых, я начинающий разработчик с 1 года, сейчас я прохожу стажировку, и мой начальник хочет, чтобы я создал генератор документации на основе кода.

генератор документации на основе кода?

Пример :

это пример файла c ++, который программа будет читать и извлекать всю информацию, в данном случае это имя функции (returnANumber), переменная (i), директива using (iostream).

В качестве первого подхода я хотел использовать REGEX, и сопоставить, например:

Решение

Итак, у вас есть два варианта:

парсить отдельные файлы так, как это делает компилятор, используя полные возможности предварительной обработки, чтобы получить текст программы таким, каким его видит компилятор. Это требует инструментов для обработки всех директив препроцессора, включая любые (обычно), найденные в командной строке компилятора. Компиляторы создают полные таблицы символов, которые содержат ИМХО именно ту информацию, которую вы хотите извлечь. Для этого вам нужно что-то, что имеет полный интерфейс компилятора. У вас нет энергии, чтобы построить его самостоятельно.

Некоторые варианты для последнего:

  • Clang / LLVM
  • Edison Design Group (EDG) интерфейс C ++
  • Наш инструментарий реинжиниринга программного обеспечения DMS.
  • GCC (вероятно, производный инструмент GCCXML)

DMS коммерческая, но имеет варианты лицензий на исследования; кодирование выполняется в сочетании с предметно-ориентированными языками, включающими BNF, грамматику атрибутов и язык параллельного программирования PARLANSE. DMS обрабатывает GCC и MS диалекты C ++ до C ++ 11 и большей части C ++ 14.

GCC написан на C, но на самом деле очень хочет быть компилятором и будет сопротивляться вашим усилиям по адаптации к вашим целям. Тем не менее, другие люди были здесь раньше с GCC и создали GCCXML поверх, который извлекает, по крайней мере, некоторую информацию, которую вы хотите в виде файла XML; это может быть вашим лучшим выбором, если вы хотите легко получить информацию в форме, которой вы можете манипулировать.

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

В общем, проще всего проанализировать такие типичные файлы конфигурации в два этапа: сначала прочитать строки, а затем проанализировать их один за другим.
В C++ строки можно читать из потока с помощью std::getline() . Хотя по умолчанию он будет читать до следующего '\n' (который он будет использовать, но не возвращать), вы также можете передать ему какой-то другой разделитель, что делает его хорошим кандидатом для чтения до некоторого символа, например = в вашем примере.

Для простоты в следующем предполагается, что = не окружен пробелом. Если вы хотите разрешить пробелы в этих позициях, вам нужно стратегически разместить is >> std::ws перед прочтением значения и удалить конечные пробелы из ключей. Однако, IMO, небольшая добавленная гибкость в синтаксисе не стоит хлопот для читателя файла конфигурации.

(Добавление обработки ошибок оставлено в качестве упражнения для читателя.)

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

Например, если вы решите использовать библиотеку Config4Cpp (которую я поддерживаю), синтаксис вашего файла конфигурации будет немного другим (заключите двойные кавычки в значения и завершите операторы присваивания точкой с запятой), как показано в примере ниже :

Следующая программа анализирует указанный выше файл конфигурации, копирует нужные значения в переменные и печатает их:

Затем вы можете прочитать его в именованные переменные или даже сохранить все в std :: map и т.д. Последнее означает, что вы можете добавлять опции без необходимости изменять и перекомпилировать свой анализатор конфигурации.

Почему бы не попробовать что-то простое и удобочитаемое, например, JSON (или XML)?

Существует много готовых реализаций с открытым исходным кодом JSON (или XML) для C++ - я бы использовал одну из них.

А если вы хотите что-то более «бинарное» - попробуйте BJSON или BSON :)

Вот простой способ обойти пробел между знаком «=» и данными в файле конфигурации. Присвойте потоку istringstream из местоположения после знака '=', и при чтении из него все начальные пробелы игнорируются.

Примечание: при использовании istringstream в цикле обязательно вызовите clear (), прежде чем присваивать ему новую строку.

Это только заголовок C++ версии inih.

inih (INI не изобретен здесь) - это простой анализатор файлов .INI, написанный на C. Это всего лишь несколько страниц кода, и он был разработан для маленький и простой, так что это хорошо для встроенных систем. Это также больше или менее совместим с .INI-файлами в стиле ConfigParser Python, включая многострочный синтаксис в стиле RFC 822 и записи name: value.

Читайте также: