巩固C语言(十一)----文件的数据处理
2016-04-19 14:54
507 查看
一 单线程文件处理,边读取边处理
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> void main() { clock_t start, finish; double duration; FILE *fp = fopen("dangdangwang.txt", "rb"); if (!fp) { printf("读文件打开失败!\n"); system("pause"); exit(-1); } FILE *wp = fopen("result.txt", "wb"); if (!wp) { printf("写文件打开失败!\n"); system("pause"); exit(-1); } //fseek接受三个参数,一切正常返回0,否则返回-1; //第一个参数为指向被搜索文件的指针; //第二个参数为偏移量,long类型,可为正、负和零; //第三个参数为模式,用来标识起始点,SEEK_SET 文件开始,SEEK_CUR 当前位置, SEEK_END 文件结尾 int s = fseek(fp, 0L, SEEK_END); if (s == 0) { //以一个long类型值返回一个文件的当前位置,返回的是字节数目 long sz = ftell(fp); printf("当前文件大小为%ldB字节, %lfKB, %lfMB, %lfGB\n", sz, sz / 1024.0, sz / (1024.0*1024.0), sz / (1024.0*1024.0*1024.0)); fprintf(wp, "当前文件大小为%ldB, %lfKB, %lfMB, %lf%GB\n", sz, sz / 1024.0, sz / (1024.0*1024.0), sz / (1024.0*1024.0*1024.0)); } //开始查找 char ch[20] = {0}; printf("请输入要查找的内容,输入字符\'*\'代表结束:"); scanf("%s", ch); while (*ch != '*') { start = clock(); rewind(fp); //回到文件开始处 char buf[4096] = { 0 }; int num = 0; while (fgets(buf, 4096, fp)!=NULL && buf[0]!='\n') { if (strstr(buf, ch)) { num++; printf("%s\n", buf); fprintf(wp, "%s\n", buf); } } finish = clock(); duration = (double)(finish - start)/CLOCKS_PER_SEC; printf("\n===============共%d条结果,耗时:%2.2f秒===============\n\n", num, duration); fprintf(wp, "\n===============共%d条结果,耗时:%2.2f秒===============\n\n", num, duration); printf("请输入要查找的内容,输入字符\'*\'代表结束:"); scanf("%s", ch); } fclose(fp); fclose(wp); system("pause"); }
运行结果:
lz687197@dangdang.com,赵四清,东大街20号生物安全中心实验室,111,1,01066948312,13321126010,481.00 ceangel78@163.com,赵四方,青岛中路72号第二热电厂,137,1113,15863103610,13869047158,33.40 ==============共49条结果,耗时:10.01秒===============
goto8381@126.com,刘能祥,御道街53号南京震天宇公司 (送货前先电话联系),132,1601,,13851788720,51.00 goto8381@126.com,刘能祥,御道街53号南京震天宇公司 (送货前先电话联系),132,1601,,13851788720,30.40 xuchengzhu@126.com,刘能慧,东方路989号中达广场25楼浦发银行TM部,131,3,50327750,13402027248,17.50 ===============共79条结果,耗时:4.08秒===============
注意:该程序不需要将文本读入内存,在检索的时候一边读入文本一边进行检索,所以耗时较长,经测试,最短时长为3秒。
二 单线程文件处理,将文本内容读入内存中
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> char **p = NULL; //存放指针数组的地址 //获取文件大小 long GetFileSize(char *path) { // printf("开始处理文件大小......\n"); FILE *fp = fopen(path, "r"); if (!fp) { printf("文件读取失败!\n"); return -1; } fseek(fp, 0, SEEK_END); long sz = ftell(fp); // printf("\t该文件大小为%lddB, %fKB, %fMB, %fGB\n", sz, sz / 1024.0, sz / (1024.0*1024.0), sz / (1024.0*1024.0*1024.0)); fclose(fp); return sz; } //获取行数, 13180807行 long GetLineNum(char *path) { // printf("开始处理行数......\n"); FILE *fp = fopen(path, "r"); if (!fp) { printf("文件读取失败!\n"); return -1; } long n = 0; //It returns 0 if the current position is not end of file. ----From MSDN while (!feof(fp)) { char tem[275] = { 0 }; n++; fgets(tem, 275, fp); } fclose(fp); // printf("\t该文件共有%ld行。\n", n); return n; } //将文件内容加载到内存中 //将每一行的地址赋予指针,以便存储节约内存空间 void GetTextToMemory(char *path, long lineNO) { // printf("将文本内容载入内存\n"); p = (char **)malloc(lineNO * sizeof(char *)); //分配指针数组 FILE *fp = fopen(path, "r"); if (!fp) { printf("初始化失败!\n"); return; } for (long i = 0; i < lineNO; i++) { char tem[512] = { 0 }; //读取字符串的缓冲区 fgets(tem, 512, fp); //从文件中逐行读取字符串 int len = strlen(tem) + 1; //实际读出的字符串+1 char *px = (char *)malloc(len * sizeof(char)); //为每一行读取的数据开辟空间 strcpy(px, tem); //拷贝字符串 px[len - 1] = '\0'; //设置最后一个字符为'\0' p[i] = px; //存储字符串的首地址到指针数组 } // printf("载入内存成功!\n"); } void FindStr(char *str, long n) { long line = 0; for (long i = 0; i < n; i++) { if (strstr(p[i], str) != NULL) { printf("%s\n", p[i]); line++; } } printf("======================共有%d行===========================\n", line); } void main() { time_t start, finish; char *path = "F:\\下载\\学习\\精品软件\\dangdangwang.txt"; printf("开始文件处理......\n"); long n = GetLineNum(path); GetFileSize(path); GetTextToMemory(path, n); printf("文件处理结束!\n"); char str[40] = { 0 }; printf("请输入您要查询的内容(输入字符\'*\'代表结束!):"); scanf("%s", str); while (str[0] != '*') { start = clock(); FindStr(str, n); finish = clock(); double dur = (double)(finish - start) / CLOCKS_PER_SEC; printf("======================耗时%.2f秒===========================\n", dur); printf("请输入您要查询的内容(输入字符\'*\'代表结束!):"); scanf("%s", str); } system("pause"); }
运行结果:
iceangel78@163.com,赵四方,青岛中路72号第二热电厂,137,1113,15863103610,13869047158,33.40 ======================共有49行=========================== ======================耗时0.52秒===========================
goto8381@126.com,刘能祥,御道街53号南京震天宇公司 (送货前先电话联系),132,1601,,13851788720,51.00 goto8381@126.com,刘能祥,御道街53号南京震天宇公司 (送货前先电话联系),132,1601,,13851788720,30.40 xuchengzhu@126.com,刘能慧,东方路989号中达广场25楼浦发银行TM部,131,3,50327750,13402027248,17.50 ======================共有79行=========================== ======================耗时0.45秒=========================== 请输入您要查询的内容(输入字符'*'代表结束!):*
该程序初始化阶段用时较长,而检索时间耗时较短。与上一个程序效率上高了很多。
相关文章推荐
- C++读书笔记(持续更新)
- 奇数偶数序列
- C语言中的找特殊数字问题
- 控制符endl与换行符'\n'的区别
- 第4周 C语言及程序设计提高例程-4 函数的返回值
- 关于C/C++中的inline
- C++ 类的三种构造函数(默认构造,拷贝构造,赋值构造),在什么情况下会被调用
- 谈谈基类与子类的this指针(C++)
- [c++]非局部静态对象初始化顺序
- 语法错误 : 缺少“;”(在“类型”的前面)
- 详解C++中的const关键字及与C语言中const的区别
- 用C++使用Android Log API输出日志
- c语言中的break和continue
- C++隐藏规则
- C语言之字符串的表示方式
- protobuf c++ api 简介
- 用1元,2元,5元,10元,20元,50元组合成100元
- C++ WINDOWS API 如何使用NMAKE和CL编译
- C++学习笔记十六 - 文本处理string.H 类的用法,
- C++访问声明