1. 新建项目dangdangusersearch

2.编写头文件head.h

#ifndef
_HEAD_H_

#define
_HEAD_H_

#include
<stdio.h>   
//注意文件操作相关函数的头文件是stdio.h

#include<stdlib.h>   
//为了使用system函数

#include
<string.h>  
//字符串操作所用到的头文件

#include<Windows.h>  
//使用休眠函数时用到的头文件

#include
<crtdbg.h>  
//做内存泄露检測所需的头文件

//开启内存检測

#define
_CRTDBG_MAP_ALLOC

/*菜单查看*/

extern
void
main_view();

/*获得文件的字节大小*/

extern
int
getFileSize(const
char *path);

/*载入文件,fPath为传递进去的文件路径*/

extern
void
loadFile(const
char *fPath,
const
int
rowSize);

/*通过keyword查找*/

extern
void
findStringByKeyword(const
char *keyword,
const
int
rowSize);

/*查看文件里有多少行*/

extern
int
getFileRow(const
char *path);

/*释放存放每行直至的数组的内存和每行字符串所占的内存*/

extern
void
freeMemory(char
**pp,
const
int
rowSize);

#endif

3.编写main.c

//注意文件操作相关函数的头文件是stdio.h

#include
"head.h"

/*菜单查看*/

void
main_view()

{

system("cls");

printf("\n******************当当用户信息查询系统*******************\n");

printf("\t1.加载数据至内存(-l)\n");

printf("\t2.查找字符串(-s)\n");

printf("\t3.释放内存(-f)\n");

printf("\n*************************0.退出**************************\n");

}

4.编写file.c

#define
_CRT_SECURE_NO_WARNINGS

#include
"head.h"

char **pp
= NULL;
//存储指针数组的地址

FILE *pf
= NULL; 
//定义一个文件指针

int
flag = 0;    
//这个标识符用于推断是否载入完毕,0:标识没有载入,1:表示完毕载入,2:表示释放释放内存

/*获得文件的字节大小*/

int
getFileSize(const
char *path)

{

//依照读取的模式打开

pf =
fopen(path,
"r");

if (pf
== NULL)

{

//代表获取文件失败

return -1;

}

else

{

//fseek():Moves thefile pointer to a specified location.

fseek(pf,
0, SEEK_END);

//ftell( FILE*stream ):文件开头到当前位置有多少个字节

int
num =
ftell(pf);

fclose(pf);//关闭文件

return
num;

}

}

/*载入文件,fPath为传递进去的文件路径*/

void
loadFile(const
char *fPath,
const
int
rowSize)

{

printf("载入文件里,请稍后....");

//pp里面存储的是每行字符串的地址

pp = (char
**)malloc(sizeof(char
*)*rowSize);

pf =
fopen(fPath,
"r");

if (pf
== NULL)

{

printf("对不起,载入文件失败!

");

return;

}

else

{

int
i;

for (i
= 0; i <
rowSize;
i++)

{

//读取字符串的缓冲区

char
str[275] = { 0 };

//*fgets( char*string, int n, FILE *stream );

//从文件里逐行读取字符串

fgets(str,
275, pf);

//获取要分配的字符串长度,最后加一是由于'\0'

int
strlength =
strlen(str)
+ 1;

//分配内存

char *px
= malloc(sizeof(char)*strlength);

//拷贝字符串

strcpy(px,
str);

//设定最后一个字符串为'\0'

px[strlength
- 1] = '\0';

//存储字符串的首地址到指针数组

pp[i]
= px;

}

}

fclose(pf);

flag = 1;

printf("加载内存OK\n");

}

/*通过keyword查找*/

void
findStringByKeyword(const
char *keyword,
const
int
rowSize)

{

if (pp
== NULL)

{

printf("对不起。您还没有载入文件,请您先载入文件\n");

return;

}

int
i;

for (i
= 0; i <
rowSize;
i++)

{

//遍历全部的指针数组的地址。字符串查找

char *ptemp
= strstr(pp[i],
keyword);

if (ptemp
!= NULL)

{

printf("\n%s",
pp[i]);//打印字符串

}

}

}

int
getFileRow(const
char *path)

{

//读取的模式打开

pf =
fopen(path,
"r");

if (pf
== NULL)

{

//代表获取失败

return -1;

}

else

{

int
i = 0;

//是否到文件末尾

while (!feof(pf))

{

char
str[275];

fgets(str,
275, pf);//读取一行

i++;

}

fclose(pf);

return
i;

}

}

/*释放存放每行直至的数组的内存和每行字符串所占的内存*/

void
freeMemory(char
**pp,
const
int
rowSize)

{

printf("正在释放内存,请稍后!

");

int
i;

for (i
= 0; i <
rowSize;
i++)

{

//通过这样的方式释放内存的时候较慢,由于是一行行的释放的

free(pp[i]);

}

free(pp);

flag = 0;

}

5.编写DDSS.c

#define
_CRT_SECURE_NO_WARNINGS

#include
"head.h"

extern
int
flag;

extern
char **pp;

/************************************************************************/

/*
当当用户信息查询系统                                                */

/************************************************************************/

int
main(int
argc,
char *argv[])

{

//文件所在位置

char *path
= "G:\\dangdangwang.txt";

int
fileSize =
getFileSize(path);

//printf("%d字节,%fK,%fM", fileSize, fileSize /1024.0,
fileSize / 1024.0 / 1024.0);

//这个选择菜单是的字符串

char
choice[25];

//获得行号

int
row =
getFileRow(path);

printf("%d\n",
row);

flag:system("cls");

main_view();

if (flag)

{

printf("文件载入完成,能够进行查找了!\n");

}

else
if (flag
== 0)

{

printf("文件未载入状态,请您先载入文件!\n");

}

while (1)

{

printf("输入内容或选择('-v'显示菜单):");

scanf("%24s",
choice);

if (!strcmp(choice,
"-v") || !strcmp(choice,
"-view")){

main_view();

}

else
if (!strcmp(choice,
"-l") || !strcmp(choice,
"-loadFile"))

{

loadFile(path,
row);

}

else
if (!strcmp(choice,
"-s") || !strcmp(choice,
"-search"))

{

while (1)

{

char
keyword[100] = { 0 };

printf("\n请输入要查找的字符串,输入-exit将退出查找\n");

scanf("%s",
keyword);

if (strcmp(keyword,
"-exit"))

{

findStringByKeyword(keyword,
row);

}

else

{

break;

}

}

}

else
if (!strcmp(choice,
"-f") || !strcmp(choice,
"-free"))

{

freeMemory(pp,
row);

}

goto
flag;

}

system("pause");

return 0;

}

将查询到的结果封装到txt文本中

#define
_CRT_SECURE_NO_WARNINGS  
//关闭安全检查

#include
<stdio.h>

#include
<stdlib.h>

void
main()

{

char *path
= "G:\\dangdangwang.txt";

char *respath
= "G:\\1.txt";

FILE *pf;

FILE *fp;

pf =
fopen(path,"r");//读的模式

fp =
fopen(respath,"w");//写的模式

if (pf
== NULL)

{

printf("文件打开失败");

}

else

{

//文件指针到末尾

fseek(pf,
0, SEEK_END);

int
num =
ftell(pf);

char 
strinfo[200];

sprintf(strinfo,
"\nnum=%d字节,%fK,%fM",
num,
num / 1024.0,
num / 1024.0 / 1024.0);

fputs(strinfo,
fp);//写入文件

rewind(pf);//回到文件开头

while (!feof(pf))

{

//缓冲区

char
str[200];

//读取。依照行读取

fgets(str,
200, pf);

if (strstr(str,"谭胜")
!= NULL) 
//字符串查找

{

fputs(str,
fp);//写入文件

printf("\n%s",
str);//打印结果

}

}

fclose(fp);  
//关闭文件

fclose(pf);  
//关闭文件

}

//打开结果文件

system(respath);

system("pause");

}

单线程实现检索当当网泄露的1GB用户数据的更多相关文章

  1. Python爬虫库Scrapy入门1--爬取当当网商品数据

    1.关于scrapy库的介绍,可以查看其官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/ 2.安装:pip install scrapy  注意这 ...

  2. 为什么在我眼里你是一只傻逼——傻逼“常所用”句型之(2)——“当当网的就有XXX人评论,YYY%的推荐”

    A:这东西里面尽是大粪. B:这东西当当网的就有325人评论,98.8%的推荐.京东的整体评论是五星,37人评价,31人给好评,1人差评,5人中评:亚马逊有6条好评,1条中评. http://news ...

  3. 当当网开源Dubbox,扩展Dubbo服务框架支持REST风格远程调用

    当当网近日开源了Dubbox项目,可为Dubbo服务框架提供多项扩展功能,包括REST风格远程调用.Kryo/FST序列化等等. 当当网架构部和技术委员会架构师沈理向InfoQ中文站介绍了Dubbox ...

  4. [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET

    Women Techmaker 北京站 [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET     [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素    发表于2 ...

  5. 网络爬虫之定向爬虫:爬取当当网2015年图书销售排行榜信息(Crawler)

    做了个爬虫,爬取当当网--2015年图书销售排行榜 TOP500 爬取的基本思想是:通过浏览网页,列出你所想要获取的信息,然后通过浏览网页的源码和检查(这里用的是chrome)来获相关信息的节点,最后 ...

  6. 转 当当网资深DBA:DB运维四大现代化的实现

    位好,今天我的主题是 <DB运维的四个现代化> ,看标题就能明白,是关于DBA自动化运维平台的事情.http://dbaplus.cn/news-21-855-1.html 主要是分享下我 ...

  7. java爬虫,爬取当当网数据

     背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...

  8. Python 爬虫 当当网图书 scrapy

    目标站点需求分析 获取当当网每个图书名字和评论数 涉及的库 scrapy,mysql 获取解析单页源码 保存到数据库中 结果

  9. Scrapy爬虫(5)爬取当当网图书畅销榜

      本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下:   我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...

随机推荐

  1. react --- React中state和props分别是什么?

    props React的核心思想就是组件化思想,页面会被切分成一些独立的.可复用的组件. 组件从概念上看就是一个函数,可以接受一个参数作为输入值,这个参数就是props,所以可以把props理解为从外 ...

  2. SharePoint 修改完或制作完一定要发布

    设置了匿名访问但是网站就是需要登录,找了很多问题. 首先想到的映射问题,然后努力检查,最后把代码删掉,然后把站删掉,最后测试出来问题. 点击上方[网站设置] 把修改过的文件发布. 母版也和布局页 一定 ...

  3. [POI2011]MET-Meteors 整体二分_树状数组_卡常

    线段树肯定会 TLE 的,必须要用树状数组. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorith ...

  4. 前端之CSS选择器

    基本选择器 元素选择器 p {color: "red";} ID选择器 #i1 { background-color: red; } 类选择器 .c1 { font-size: 1 ...

  5. Linux 中挂载 ISO 文件

    在 Linux 中挂载 ISO 文件 用 mount 命令,在终端中输入如下命令即可: sudo mount -o loop filename.iso /cdrom 其中 filename.iso 是 ...

  6. head---显示文件的开头的内容

    head命令用于显示文件的开头的内容.在默认情况下,head命令显示文件的头10行内容. 语法 head(选项)(参数) 选项 -n<数字>:指定显示头部内容的行数: -c<字符数& ...

  7. Linux Virtual Server技术

    1 LVS简单介绍 Linux VirtualServer是一个高扩展和高可用性server,在一个真正server的集群中构建而成,包括Linux操作系统中的负载均衡. server的架构对于终端用 ...

  8. Android页面事件挂接模拟

    Java没有C#的引用类型.因此事件的挂接一般都是利用接口来实现,有两种方式: 1)定义一个实现事件接口的类,然后实现接口方法,然后通过将这个类的实例加入到事件监听器里面: public class ...

  9. Android LruCache 压缩图片 有效避免程序OOM

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...

  10. 大型网站架构之JAVA中间件

    中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品.常见的有: 远程服务框架中间件:主要解决各子模块之间互相访问的问题. 消息队列中间件:主要解决各子模之间消息共享 ...