c++ 如何在文件中匹配一个字符串
1个回答
展开全部
如果文件不是太大(比你当前的可用剩余内存小),且文件中不包含“0”这样的字节,直接把文件用一个缓冲调进内存,然后用字串搜索函数搜就是了;
如果文件确实太大,或者文件中可能包含“0”这样的字节,那么你需要自己编写模式匹配函数(就是与字串搜索函数类似功能的函数,网上有类似的C++源代码,但功能还不够)。
对含0数据的适应比较简单,搜索函数只要额外加两个缓冲区数据长度的参数传进去就行(代替以0结尾的字符串处理机制)——一个主缓冲长度,一个子串长度。
而跨缓冲区的搜索比较麻烦,因为搜索字很可能跨在两个相邻缓冲之间,这时搜索函数需要返回两个信息:一是搜索到的子串位置,二是本缓冲区内匹配了多少字节的子串(完全匹配时就是匹配了整个子串的长度);如果需要多次搜索子串在缓冲中的所有位置,则还需要把搜索起始位置做参数传进搜索函数。当然,这时子串在缓冲中搜索到的各位置必须转换为文件的绝对坐标才行。
跨缓冲区的搜索,上一缓冲的最后搜索结果(位置、已匹配长度)要带进下一缓冲的搜索,这些必要信息也要传进搜索函数,因此这是个复杂而参数众多的函数。
如果文件确实太大,或者文件中可能包含“0”这样的字节,那么你需要自己编写模式匹配函数(就是与字串搜索函数类似功能的函数,网上有类似的C++源代码,但功能还不够)。
对含0数据的适应比较简单,搜索函数只要额外加两个缓冲区数据长度的参数传进去就行(代替以0结尾的字符串处理机制)——一个主缓冲长度,一个子串长度。
而跨缓冲区的搜索比较麻烦,因为搜索字很可能跨在两个相邻缓冲之间,这时搜索函数需要返回两个信息:一是搜索到的子串位置,二是本缓冲区内匹配了多少字节的子串(完全匹配时就是匹配了整个子串的长度);如果需要多次搜索子串在缓冲中的所有位置,则还需要把搜索起始位置做参数传进搜索函数。当然,这时子串在缓冲中搜索到的各位置必须转换为文件的绝对坐标才行。
跨缓冲区的搜索,上一缓冲的最后搜索结果(位置、已匹配长度)要带进下一缓冲的搜索,这些必要信息也要传进搜索函数,因此这是个复杂而参数众多的函数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询