我有一个以下格式的文本文件:
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
找到其中一个分隔符,但是如何在两者之间找到另一个结尾和数据?请指导我,谢谢大家。
答案 0 :(得分:1)
首先,您应该定义(至少在纸上或评论中)精确地您的文件的格式,可能通过一些EBNF表示法。一个例子永远不够(当然,除了格式文档之外,还有一些真实的具体例子,而不是抽象的例子)。如果该文件是由其他软件生成的,则该软件应记录该格式。
您需要逐行阅读文件(例如使用std::getline),并且可能完全(或者至少在您获得所有想要的信息之前)。您可以使用标准lexing和parsing技术(可能在每一行,也许在整个文件中)。你可以(至少如果文件不是很大)在内存中填充一些数据。
如果文件非常大(例如,不适合RAM的千兆字节),则可以读取两次。第一次,计算相关线(或数据块)的偏移量(使用tellg),例如进入某些std::map
,第二次适当地使用seekg来阅读该文件的部分内容。
如果您可以更改文件的格式,可以考虑使用标准的文本序列化格式,如JSON(有几个C ++库处理它,例如JSONCPP)或YAML(我不建议使用XML,除非它是外部要求,因为XML过于复杂且过于冗长。您可能还会考虑一些数据库方法,可能就像Sqlite一样简单。