对身边的大神写的快速读入int和string方法的解读
来源:互联网 发布:大数据营销案例ppt 编辑:程序博客网 时间:2024/06/07 12:02
===========骨灰级菜鸟的第一篇技术博客,勿喷=========
同学写了一个快速读入int和string的程序,用较底层的fread读入数据,我理解了一下,现贴上源码以及自己添加的注释,表示对大神的崇敬
同学写了一个快速读入int和string的程序,用较底层的fread读入数据,我理解了一下,现贴上源码以及自己添加的注释,表示对大神的崇敬
===========骨灰级菜鸟的第一篇技术博客,勿喷=========
/* * $File: fast-read.cc * $Date: Fri Dec 21 14:44:05 2012 +0800 * $Author: Xinyu Zhou <zxytim[at]gmail[dot]com> * * A template for fast read of integer and string. * * This implementation is in MACRO format because it * yields a slightly faster code that that of using * function calls. * * This version of code uses a fixed size buffer to store * inputs by *fread*, and analyze the string manually to convert it * to int or string. Also, update the buffer when it is exhausted. * * sample usage: * READ_INT(num); * READ_STR(str); // str is a char*, which no boundary checking *//* {{{ fast read*/#include <cstdio>#include <cctype>FILE *fast_read_fin = stdin;const int N_BUF_MAX = 10000;char fast_read_buffer[N_BUF_MAX];char *fast_read_ptr = fast_read_buffer + N_BUF_MAX, *fast_read_buf_end = fast_read_buffer + N_BUF_MAX;/*都是宏定义,包含了很多宏定义的技巧*/#define PTR_NEXT() \ do { \ if (fast_read_ptr != fast_read_buf_end) \ break; \ fast_read_ptr = fast_read_buffer; /*效果:当指针指到末尾时重新指到流的开头*/\ fread(fast_read_buffer, N_BUF_MAX, 1, fast_read_fin); /*读入*/\ } while (0) /*只读入一次,使用这个循环体,是为了可以中途break;*//*关于宏定义的技巧,最后没有打分号,为了和调用时的语法 PTR_NEXT(); 后面的分号兼容,*/#define READ_INT(__num__) \ do { \ int ret = 0, sign = 1; \ for (; ;) /*将fast_read_ptr指向第一个数字或负号*/\ { \ PTR_NEXT(); \ if (isdigit(*fast_read_ptr) || (*fast_read_ptr) == '-') \ break; \ fast_read_ptr ++; \ } \ if ((*fast_read_ptr) == '-') /*若fast_read_ptr指向负号,标记并指向下一个数字*/\ { \ sign = -1; \ fast_read_ptr ++; \ } \ for (; ;) /*计算输入的数字*/\ { \ PTR_NEXT(); \ if (!isdigit(*fast_read_ptr)) \ break; \ ret = ret * 10 + (*(fast_read_ptr ++)) - '0'; \ } \ (__num__) = ret * sign; \ } while (0)#define READ_STR(__str__) \ ({ \ char *start = (__str__), \ *ret = start; \ do { \ for (; ;) /*将fast_read_ptr指向第一个非空白字符*/\ { \ PTR_NEXT(); \ if (!isspace(*fast_read_ptr)) \ break; \ fast_read_ptr ++; \ } \ for (; ;) /*将输入的非空白字符存起来*/\ { \ PTR_NEXT(); \ if (isspace(*fast_read_ptr)) \ break; \ *(ret ++) = *(fast_read_ptr ++); /*将输入的非空白字符存起来*/\ } \ (*ret) = 0; \ } while (0); \ ret - start; /*这是逗号表达式的最后一个表达式,其值就是ret - start*/\ }) /*逗号表达式 (a1, a2, a3); a1,a2,a3均为表达式(函数调用或者语句)*/ /*逗号表达式的值就是最后一个表达式的值*//* }}}*/
- 对身边的大神写的快速读入int和string方法的解读
- 对身边的人
- cpp如何快速安全地将文件读入字符串string或字符数组vector<string>的方法
- 很快的快速读入
- int类型数据的读入
- Int 和 String的转换
- String和int的转换
- int 和 String 互相转换的多种方法 (转)
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- int 和 String 互相转换的多种方法
- Java技巧: int 和 String 互相转换的多种方法
- Int 和 String 互相转换的多种方法
- string和int类型互相转换的C++方法
- auto_ptr与shared_ptr --- auto_ptr(1)
- TABLE的CSS应用(细线表格)
- auto_ptr与shared_ptr --- shared_ptr (2)
- Qt下载必应的每日图片,Windows API设置桌面背景
- css+div+图片实现高度自适应圆角框
- 对身边的大神写的快速读入int和string方法的解读
- Linux(mac) 系统 ssh 不能生成key错误处理
- linux3.6.6kvm相关源码位置
- 电商项目笔记之九:商品类别管理
- android.mk 详解 其他makefile文件类似
- ubuntu12.04+xen4.1半虚拟化安装fedora16
- 消除vc2005的sprintf警告
- ubuntu 安装 Tomcat
- 如何在jsp页面中获取js的变量值