首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

代码分享:C I/O操作和字符查寻,TR1 C++正则多行查找

2012-08-09 
代码分享:C I/O操作和字符查找,TR1 C++正则多行查找C/C++ code//功能:输出一个文件的最后n行数据,如果文件

代码分享:C I/O操作和字符查找,TR1 C++正则多行查找


C/C++ code
//    功能:输出一个文件的最后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行


[解决办法]
不错,更新挺快~~
[解决办法]
(好)
[解决办法]
强大。。。
[解决办法]
谢谢楼主分享
保存了以后看
[解决办法]
目前还不看懂,留以后研究,谢谢LZ
[解决办法]

[解决办法]
感谢分享
[解决办法]
收藏了
[解决办法]
学习了
[解决办法]
不懂C的文件操作
[解决办法]
推崇楼主的分享精神!
转《代码之美》:
C/C++ code
//摘自《代码之美》// 字符     含义// .        匹配任意的单个字符// ^        匹配输入字符串的开头// $        匹配输入字符串的结尾// *        匹配前一个字符的零个或者多个出现#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) 

热点排行