
c代码在vc++6.0里提取txt文件中的一部分。
。。。。任意字符n个。。。a。。。。。b。。。任意字符n个。。
要提取a和b之间的类容 展开
写个函数就可以了:
//pText:文本指针
//cA起始标记
//cB结束标记
//pOutBuf接收提取内容的张缓冲区
int ExtractText(const char *pText, const char cA, const char cB, char *pOutBuf){
if (pText == NULL || pOutBuf == NULL)
{
return 0;
}
char cTmp;//临时变量
char cBeginCopy = 0;//是否开始拷贝
//是否找到起始标记,没有找到,认为提取失败
char cIsFindA = 0;
while ((cTmp = *pText++) != '\0') {
if (!cBeginCopy)
{
if (cTmp == cA)
{
cBeginCopy = 1;
cIsFindA = 1;
}
}
else
{
if (cTmp == cB)
{
break;
}
*pOutBuf = cTmp; pOutBuf ++;
}
}
return cIsFindA;
}
测试代码:
int main() {
char *pTest = "1234ahello world!b112";
//char *pTest = "1234ahello world!";//没有结束标记b的
//char *pTest = "1234hello world!b112";//没有起始标记a
char cBuf[100] = {0};
if (ExtractText(pTest, 'a', 'b', cBuf))
{
printf("%s\n", cBuf);
}
else
{
printf("Extract error!\n");
}
return 0;
}
正常用例的测试结果:
被匹配的字符串是在一个txt文件中,整个文本文件很大
有多大啊?先获取一下文本大小,然后动态分配一块内存来存放文本里的字符串,然后再调用函数处理。不过如果文件非常大,处理起来会比较慢。
楼下的用strchr函数查找两个标记的方法也可行,不过需要考虑一下两个标记如果不存在的问题,而且需要遍历两次数据,效率比较低了,直接遍历一次即可提取出所需要的数据。
另外还可以把标记换成字符串,这样可以适应标记是由多个字符组成的情况:
重载一下函数:
int ExtractText(const char *pText, const char *pA, const char *pB, char *pOutBuf){
if (pText == NULL || pOutBuf == NULL)
{
return 0;
}
char *pTmp = (char *)pText;
char cBeginCopy = 0;
char cIsFindA = 0;
while (*pTmp++ != '\0')
{
if (!cBeginCopy)
{
if (strncmp(pTmp, pA, strlen(pA)) == 0)
{
cBeginCopy = 1;
cIsFindA = 1;
pTmp += (strlen(pA) - 1);//跳过起始标记长度
}
}
else
{
if (strncmp(pTmp, pB, strlen(pB)) == 0)
{
break;
}
*pOutBuf = *pTmp;
pOutBuf ++;
}
}
return cIsFindA;
}
测试:
char *pTest = "1234a1hello world!b11234";
char cBuf[100] = {0};
if (ExtractText(pTest, "a1", "b1", cBuf))
{
printf("%s\n", cBuf);
}
else
{
printf("Extract error!\n");
}
输出结果:hello world!