Разбор буфера в C ++ с использованием ООП и STL - PullRequest
0 голосов
/ 18 марта 2009

Я хочу использовать OOP, STL и т. Д. Для разбора буфера.

Мой буфер содержит

ABCDXXXX333$$$$YYYY

Мне нужно отделить ABCD XXXX 333 $$$$ YYY и переместить их в структуру. Я определил их смещение в одной из таблиц правил и сколько элементов в буфере. Несколько полей также разделены.

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

Я буду использовать это на AIX (Unix) Box.

Ответы [ 5 ]

1 голос
/ 18 марта 2009

Я бы действительно рекомендовал использовать регулярные выражения для вашей задачи, boost :: regex доступно для C ++.

Регулярное выражение защитит вас от множества технических проблем, которые обычно превращаются в неприятные проблемы безопасности.

1 голос
/ 18 марта 2009

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

Простой пример для вашего примера:

class DataContainer
{
    using namespace std; // FIXME Is this legal?

    public:
        DataContainer(string part1, string part2, string part3, string part4, string part5) :
            m_part1(part1), m_part2(part2), m_part3(part3), m_part4(part4), m_part5(part5)
        {
        }

        static DataContainer readFromStream(istream &stream)
        {
            DataContainer ret;
            char tmp[16];

            stream.get(tmp, 4);
            ret.m_part1 = string(tmp, 4);

            stream.get(tmp, 4);
            ret.m_part2 = string(tmp, 4);

            stream.get(tmp, 3);
            ret.m_part3 = string(tmp, 3);

            stream.get(tmp, 4);
            ret.m_part4 = string(tmp, 4);

            stream.get(tmp, 3);
            ret.m_part5 = string(tmp, 3);

            return ret;
        }

    private:
        DataContainer()
        {
        }

        string m_part1, m_part2, m_part3, m_part4, m_part5;  // Put these in an array if they belong in an array.
};

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

Используйте это так:

DataContainer dc = DataContainer::readFromStream(std::cin);

Это читает ваши данные из cin (stdin) и помещает структуру данных в dc.

Если у вас уже есть считанные данные, вы можете довольно легко использовать итераторы STL (которые в основном являются указателями на элементы контейнера). Вы также можете использовать классическую индексацию, которая проще для вашего конкретного случая. Например:

static DataContainer readFromBuffer(string buffer)
{
    DataContainer ret;
    ret.m_part1 = string(buffer, 0, 4);
    ret.m_part2 = string(buffer, 4, 4);
    ret.m_part3 = string(buffer, 8, 3);
    ret.m_part4 = string(buffer, 11, 4);
    ret.m_part5 = string(buffer, 15, 3);
    return ret;
}
1 голос
/ 18 марта 2009

Если «буфер» состоит из символа, то:

string abcd = string(buffer,0,4);
string xxxx = string(buffer,4,8);
etc.
0 голосов
/ 18 марта 2009

Чтение строки за раз с помощью std::getline(), которая вставляет строку в std::string (ваш буфер). Затем используйте std::string методы для анализа данных в соответствии с вашим форматом данных. Или используйте что-то вроде Lex / Yacc, когда вы имеете дело с реальной грамматикой, а методы std :: string становятся трудно читаемыми.

0 голосов
/ 18 марта 2009

Вы можете использовать cin.peek (), чтобы увидеть, какой символ вы хотите получить (обратите внимание, это не удалит его из потока). Возможно три класса / функции для извлечения того, что они берут, используя эту технику, и останавливаются, когда они достигают персонажа, которого они не должны держать.

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