首页 > 代码库 > 单线程实现检索当当网泄露的1GB用户数据

单线程实现检索当当网泄露的1GB用户数据


  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

 

/*菜单查看*/

externvoidmain_view();

 

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

externintgetFileSize(constchar *path);

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

externvoidloadFile(constchar *fPath,constintrowSize);

/*通过关键字查找*/

externvoidfindStringByKeyword(constchar *keyword,constintrowSize);

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

externintgetFileRow(constchar *path);

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

externvoidfreeMemory(char **pp,constintrowSize);

 

#endif

3.编写main.c

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

#include"head.h"

 

/*菜单查看*/

voidmain_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; //定义一个文件指针

intflag = 0;    //这个标识符用于判断是否加载完成,0:标识没有加载,1:表示完成加载,2:表示释放释放内存

 

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

intgetFileSize(constchar *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 ):文件开头到当前位置有多少个字节

       intnum =ftell(pf);

       fclose(pf);//关闭文件

       returnnum;

   }

}

 

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

voidloadFile(constchar *fPath,constintrowSize)

{

   printf("加载文件中,请稍后....");

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

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

   pf =fopen(fPath,"r");

   if (pf == NULL)

   {

       printf("对不起,加载文件失败!");

       return;

   }

   else

   {

       inti;

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

       {

           //读取字符串的缓冲区

           charstr[275] = { 0 };

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

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

           fgets(str, 275, pf);

           //获取要分配的字符串长度,最后加一是因为‘\0‘

           intstrlength =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");

}

 

/*通过关键字查找*/

voidfindStringByKeyword(constchar *keyword,constintrowSize)

{

   if (pp == NULL)

   {

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

       return;

   }

   inti;

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

   {

       //遍历所有的指针数组的地址,字符串查找

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

       if (ptemp != NULL)

       {

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

       }

   }

}

 

intgetFileRow(constchar *path)

{

   //读取的模式打开

   pf =fopen(path,"r");

   if (pf == NULL)

   {

       //代表获取失败

       return -1;

   }

   else

   {

       inti = 0;

       //是否到文件末尾

       while (!feof(pf))

       {

           charstr[275];

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

           i++;

       }

       fclose(pf);

       returni;

   }

}

 

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

voidfreeMemory(char **pp,constintrowSize)

{

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

   inti;

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

   {

       //通过这种方式释放内存的时候较慢,因为是一行行的释放的

       free(pp[i]);

   }

   free(pp);

   flag = 0;

}

5.编写DDSS.c

#define_CRT_SECURE_NO_WARNINGS

#include"head.h"

 

externintflag;

externchar **pp;

 

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

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

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

intmain(intargc,char *argv[])

{

   //文件所在位置

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

   intfileSize =getFileSize(path);

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

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

   charchoice[25];

 

   //获得行号

   introw =getFileRow(path);

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

 

flag:system("cls");

   main_view();

   if (flag)

   {

       printf("文件加载完毕,可以进行查找了!\n");

   }

   elseif (flag == 0)

   {

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

   }

   while (1)

   {

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

       scanf("%24s",choice);

 

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

           main_view();

       }

       elseif (!strcmp(choice,"-l") || !strcmp(choice,"-loadFile"))

       {

           loadFile(path,row);

       }

       elseif (!strcmp(choice,"-s") || !strcmp(choice,"-search"))

       {

           while (1)

           {

               charkeyword[100] = { 0 };

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

               scanf("%s",keyword);

 

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

               {

                   findStringByKeyword(keyword,row);

               }

               else

               {

                   break;

               }

           }

       }

       elseif (!strcmp(choice,"-f") || !strcmp(choice,"-free"))

       {

           freeMemory(pp,row);

       }

       gotoflag;

   }

 

   system("pause");

   return 0;

}

 

 

 

 

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

#define_CRT_SECURE_NO_WARNINGS  //关闭安全检查

#include<stdio.h>

#include<stdlib.h>

 

voidmain()

{

   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);

       intnum =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))

       {

           //缓冲区

           charstr[200];

           //读取,按照行读取

           fgets(str, 200, pf);

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

           {

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

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

           }

       }

       fclose(fp);  //关闭文件

       fclose(pf);  //关闭文件

   }

   //打开结果文件

   system(respath);

   system("pause");

}