单线程实现检索当当网泄露的1GB用户数据
新建项目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用户数据的更多相关文章
- Python爬虫库Scrapy入门1--爬取当当网商品数据
1.关于scrapy库的介绍,可以查看其官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/ 2.安装:pip install scrapy 注意这 ...
- 为什么在我眼里你是一只傻逼——傻逼“常所用”句型之(2)——“当当网的就有XXX人评论,YYY%的推荐”
A:这东西里面尽是大粪. B:这东西当当网的就有325人评论,98.8%的推荐.京东的整体评论是五星,37人评价,31人给好评,1人差评,5人中评:亚马逊有6条好评,1条中评. http://news ...
- 当当网开源Dubbox,扩展Dubbo服务框架支持REST风格远程调用
当当网近日开源了Dubbox项目,可为Dubbo服务框架提供多项扩展功能,包括REST风格远程调用.Kryo/FST序列化等等. 当当网架构部和技术委员会架构师沈理向InfoQ中文站介绍了Dubbox ...
- [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET
Women Techmaker 北京站 [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素 发表于2 ...
- 网络爬虫之定向爬虫:爬取当当网2015年图书销售排行榜信息(Crawler)
做了个爬虫,爬取当当网--2015年图书销售排行榜 TOP500 爬取的基本思想是:通过浏览网页,列出你所想要获取的信息,然后通过浏览网页的源码和检查(这里用的是chrome)来获相关信息的节点,最后 ...
- 转 当当网资深DBA:DB运维四大现代化的实现
位好,今天我的主题是 <DB运维的四个现代化> ,看标题就能明白,是关于DBA自动化运维平台的事情.http://dbaplus.cn/news-21-855-1.html 主要是分享下我 ...
- java爬虫,爬取当当网数据
背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...
- Python 爬虫 当当网图书 scrapy
目标站点需求分析 获取当当网每个图书名字和评论数 涉及的库 scrapy,mysql 获取解析单页源码 保存到数据库中 结果
- Scrapy爬虫(5)爬取当当网图书畅销榜
本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: 我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...
随机推荐
- PDO 拿出來的 Float 數據跟数据库中的数据不匹配
数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0 数据库:75.2 -> 程序打印:75.3 在另外一个测试 ...
- 【转载】AngularJS 用$sce服务来过滤HTML标签,解决无法正确显示后台传递的html标签
angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有 ...
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(1)
在前面的章节中,我们已经理解了各种复制概念.这不仅仅是一个为了接下来将要介绍的东西而增强您的意识的理论概述,还将为您介绍大体的主题. 在本章,我们将更加接近实际的解决方案,并了解PostgreSQL内 ...
- codeforces 400 C Inna and Huge Candy Matrix【模拟】
题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 #include<iostream> #inc ...
- 在Ubuntu上创建一个可以启动的U盘
1.概观 使用可启动的Ubuntu USB盘,您可以: 安装或升级Ubuntu 在不触及PC配置的情况下测试Ubuntu桌面体验 在借来的机器或网吧上启动到Ubuntu 使用USB盘上默认安装的工具来 ...
- vue项目的一些最佳实践提炼和经验总结
项目组织结构 ajax数据请求的封装和api接口的模块化管理 第三方库按需加载 利用less的深度选择器优雅覆盖当前页面UI库组件的样式 webpack实时打包进度 vue组件中选项的顺序 路由的懒加 ...
- 删除小脚本 srm
提示:只能删除当前路径下的目录或文件 #!/bin/bash #将测试好的脚本,拷贝到 $PATH 能够搜索到目录下.并且改名 例如: /usr/local/bin cp /test/srm.sh / ...
- numpy基础篇-简单入门教程3
np import numpy as np np.__version__ print(np.__version__) # 1.15.2 numpy.arange(start, stop, step, ...
- Java 异常的捕获与处理详解 (一)
一,异常的产生(Exception) 异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就会中断执行. An exception is a flow of inst ...
- ECNUOJ 2150 完美的拯救
完美的拯救 Time Limit:1000MS Memory Limit:65536KBTotal Submit:147 Accepted:50 Description 一只可怜的蚂蚁被万恶的魔术师 ...