我想使用OOP和STL等来解析缓冲区。
我的缓冲区包含
ABCDXXXX333$$$$YYYY
我需要将ABCD XXXX 333 $$$$ YYY
分开并将它们移到struct。我在其中一个规则表中定义了偏移量,缓冲区中有多少个元素。其中一些领域也是分隔的。
我将在AIX(Unix)Box上使用它。
答案 0 :(得分:1)
您可能会让包含所有数据的类具有静态函数,该函数在给定序列化字符串的情况下创建对象。它的工作原理取决于您的数据。你说你已经定义了字段的偏移量,但也说它们是分隔的。这带来了一个问题,因为两者都需要以不同的方式处理。
您的示例的简单案例:
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 :(得分:1)
如果“缓冲”由char构成,则:
string abcd = string(buffer,0,4);
string xxxx = string(buffer,4,8);
etc.
答案 2 :(得分:1)
我真的建议为您的问题使用正则表达式,boost::regex可用于C ++。
正则表达式可以保护您免受许多通常会导致严重安全问题的技术问题。
答案 3 :(得分:0)
您可以使用cin.peek ()
查看您想要获取的字符(请注意,这不会将其从流中删除)。也许有三个类/函数来提取他们使用这种技术所采取的东西,并在他们达到他们不应该持有的角色时停止。
答案 4 :(得分:0)
一次使用std::getline()
读取一行,将该行填入std::string
(您的缓冲区)。然后使用std::string
方法根据您的数据格式解析数据。或者使用类似Lex / Yacc的东西,当你有一个真正的语法来处理时,std :: string方法变得难以阅读清醒。