代码分享:C I/O操作和字符查找,TR1 C++正则多行查找
// 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据// 基本思路:把文件读入缓存,然后查找倒数第10个换行符#include <stdio.h>#include <stdlib.h>#include <string.h>// 反查找Buf缓冲区中字符ch, 次数num次, 如果找不到返回NULL,少于num,返回Bufconst char* rfindBuf_chrTimes(char* Buf, size_t BufSize , int ch, size_t num);int main(int argc, char* argv[]){ const char* fileName = "main.cpp"; //argv[1]; FILE* pFile = fopen(fileName, "r"); if (pFile == NULL) { perror("打开文件时错误!"); return -1; } // 获得文件大小 fseek(pFile, 0, SEEK_END); long fileSize = ftell(pFile); fseek(pFile, 0, SEEK_SET); // 把文件读到缓冲区 char* fileBuf = new char[fileSize + 1]; memset(fileBuf,0, fileSize + 1); fread(fileBuf, fileSize, 1, pFile); const char* ps = NULL; ps = rfindBuf_chrTimes(fileBuf, fileSize , '\n', 10); // 测试代码 printf("%s:文件大小%ld\n", fileName,fileSize); printf("%s\n", ps); delete[] fileBuf; fclose(pFile); return 0;}// 反查找Buf缓冲区中字符ch, 次数num次, 如果找不到返回NULL,少于num,返回Bufconst char* rfindBuf_chrTimes(char* Buf, size_t BufSize , int ch, size_t num){ const char* ret = Buf; const char* ps = Buf + BufSize; size_t cnt = 0; while (ps > Buf) { if (*ps == ch) cnt++; if (cnt == num) return (ret = ++ps); ps--; } if (cnt == 0) return NULL; return ret;} // 有些编辑器,会在文件最后一行插入一个空行,可能输出看上去是9行//摘自《代码之美》// 字符 含义// . 匹配任意的单个字符// ^ 匹配输入字符串的开头// $ 匹配输入字符串的结尾// * 匹配前一个字符的零个或者多个出现#include <stdio.h>int matchhere(char *regexp, char *text);int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text do {// a * matches zero or more instances if (matchhere(regexp, text)) return 1; } while (*text != '\0' && (*text++ == c || c == '.')); return 0;}int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text if (regexp[0] == '\0') return 1; if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text); if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0'; if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1); return 0;}int match(char *regexp, char *text) {// match: search for regexp anywhere in text if (regexp[0] == '^') return matchhere(regexp+1, text); do {// must look even if string is empty if (matchhere(regexp, text)) return 1; } while (*text++ != '\0'); return 0;}void main() { printf("%d==match(abc ,abc)\n",match("abc" ,"abc")); printf("%d==match(^a ,abc)\n",match("^a" ,"abc")); printf("%d==match(c$ ,abc)\n",match("c$" ,"abc")); printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc")); printf("%d==match(a.*c,abc)\n",match("a.*c","abc")); printf("-------------------\n"); printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc")); printf("%d==match(^B ,abc)\n",match("^B" ,"abc")); printf("%d==match(A$ ,abc)\n",match("A$" ,"abc")); printf("%d==match(a..c,abc)\n",match("a..c","abc")); printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));}//1==match(abc ,abc)//1==match(^a ,abc)//1==match(c$ ,abc)//1==match(a.c ,abc)//1==match(a.*c,abc)//-------------------//0==match(ABC ,abc)//0==match(^B ,abc)//0==match(A$ ,abc)//0==match(a..c,abc)//0==match(a.*d,abc)