C语言生成2000w行数据
最近一直抽空学习shell,脚本语言看多了多多少少有些蛋疼不适,所以捡起以前遇到的一个C语言的问题看看。
原先应该是在C++吧关注的一个帖子,楼主为了测试数据库性能需要如下形式的数据
要求:
- 字符串长度为16
- 字符串只能包含大小写字母和数字
- 要求生成20000000行的TXT文本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /********************************** * Author: Ervin_Zhao(2012.6) * Compile: gcc * Create a file named test.txt, included 2000w line random string * string have 16 num used A-Z, a-z, 0-9 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main( void ) { char array[]= "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890" ; char buff[170000]; char *buff2 = buff; int file = open( "test.txt" , O_WRONLY|O_CREAT, S_IRWXU|S_IRGRP|S_IROTH); int i; int temp[4]; char *p = ( char *)temp; for (i = 0; i<20000000; i++) { temp[0] = rand (); temp[1] = rand (); temp[2] = rand (); temp[3] = rand (); buff2[0] = array[p[0]%( sizeof (array)-1)]; buff2[1] = array[p[1]%( sizeof (array)-1)]; buff2[2] = array[p[2]%( sizeof (array)-1)]; buff2[3] = array[p[3]%( sizeof (array)-1)]; buff2[4] = array[p[4]%( sizeof (array)-1)]; buff2[5] = array[p[5]%( sizeof (array)-1)]; buff2[6] = array[p[6]%( sizeof (array)-1)]; buff2[7] = array[p[7]%( sizeof (array)-1)]; buff2[8] = array[p[8]%( sizeof (array)-1)]; buff2[9] = array[p[9]%( sizeof (array)-1)]; buff2[10] = array[p[10]%( sizeof (array)-1)]; buff2[11] = array[p[11]%( sizeof (array)-1)]; buff2[12] = array[p[12]%( sizeof (array)-1)]; buff2[13] = array[p[13]%( sizeof (array)-1)]; buff2[14] = array[p[14]%( sizeof (array)-1)]; buff2[15] = array[p[15]%( sizeof (array)-1)]; buff2[16] = '\n' ; buff2 += 17; if (buff2 >= (buff+ sizeof (buff))) { write(file, buff, sizeof (buff)); buff2 = buff; } } close(file); return 0; } |
这个程序结构的清晰,易于理解,真是个不错的程序
最初收藏的时候没时间去看,最近有空细看了下,在生成随机数那里看了半天,自己的底子实在是有点薄、
通过实验,原理是这样的。定义为INT形的数组,rand();函数产生8位的十六进制数,四个元素的数组,那么就是32位。
通过p指针把数组重新“翻译”,作为字符读取,2位一个字符,那么就是16个字符。通过array[p[0]%(sizeof(array)-1)]就可以随机取得array中的字符了
而且为了避免频繁读写IO,内存中待数据1万行才写入文件中,勉强看懂,叫自己写肯定是写不出。这就是学过和学会C语言的区别吧、
下面来看看另一个程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /********************************** * Author:yjf_victor(2012.6) * Compile: gcc * Create a file named test.txt, included 2000w line random string * string have 16 num used A-Z, a-z, 0-9 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <time.h> int main ( void ) { int i, j; const int cols = 16; const int rows = 20000000; const int size = ( cols + 1 ) * rows; const char str[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890" ; const char filename[] = "file.txt" ; char * p = NULL; char * pStart = NULL; int fd; p = pStart = ( char *) malloc ( size * sizeof ( char ) ); if ( p == NULL ) { fprintf ( stderr, "内存申请失败。\n" ); return EXIT_FAILURE; } srand ( time (NULL) ); for ( i = 0 ; i < rows; i ++ ) { for ( j = 0 ; j < cols; j ++ ) { *(p ++) = str[ rand ()%(62)]; } *(p ++) = '\n' ; } fd = open( filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR ); if ( fd == -1 ) { fprintf ( stderr, "文件打开错误。\n" ); return EXIT_FAILURE; } write ( fd, pStart, size ); free ( pStart ); close(fd); return EXIT_SUCCESS; } |
本以为这个更难一些呢,读起来确是很好理解。而且程序写的很棒,参数易于修改
有时想想,大一学的C语言,也不深入学习,也不去实践、也只够写个学生信息管理系统了。
这个生成2000w行数据的,估计我会一个一个的生成随机数,然后估计一顿饭的时间是等不出来结果了…==
有吧友也通过汇编实现1秒5,由于没有环境,就不运行了,有兴趣的可以去看原帖,原帖地址:http://tieba.baidu.com/p/1626351476 (已为坟,勿回)
想来shell应该也能实现这一要求,所以去弄了个shell版本的
1 | tr - dc A-Za-z0-9 < /dev/urandom | fold -w 16 | head -20000000 > file .txt |
比较简单,一行码~嘿嘿,效率嘛、有舍就有得嘛~~
初学shell就是伤不起。。。连入门都没,别说写出高效简洁的shell脚本了,本来这个shell想自己写来着,但是下意识的想去用C语言的过程化设计来实现,思维有很多时候跳不出来
这真是。。。路漫漫,慢慢走吧、、
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)