• 创建全局的二级指针

     char  ** g_pp;//全局的二级指针
  • 获取数据有多少行
     //获取行数
    int getimax()
    {
    int hang = -;
    FILE *pf = fopen(path, "r");//读文件打开路径
    if (pf == NULL)
    {
    printf("文件打开失败");
    return -;
    }
    else
    {
    hang = ;
    while (!feof(pf))//到了文件末尾返回1,没有返回0
    {
    char readstr[] = { }; fgets(readstr, , pf);//读取一行 hang++;//自增 }
    fclose(pf);//关闭
    return hang;
    }
    }
  • 定义行数
     int   imax = ;//标示有多少行
  • 载入内存
     void loadfromfile()
    { g_pp = (char **)malloc(sizeof(char*)*imax); //分配指针数组
    memset(g_pp, '\0', sizeof(char*)*imax);//内存清零 FILE *pf = fopen(path, "r");//读文件打开路径
    if (pf == NULL)
    {
    printf("文件打开失败");
    return -;
    }
    else
    {
    for (int i = ; i < imax; i++)
    {
    char str[] = { };
    fgets(str, , pf);//按行读取
    str[ - ] = '\0';
    int strlength = strlen(str); g_pp[i] = malloc(sizeof(char)*(strlength + ));//处理/0 if (g_pp[i] != NULL)
    {
    strcpy(g_pp[i], str);//拷贝到分配的内存
    }
    }
    fclose(pf);//关闭
    }
    }
  • 查询并写入到文件
    void search(char *str)
    {
    char strpath[] = { };
    sprintf(strpath, "I:\\%s.txt", str);
    FILE *pf = fopen(strpath, "w");//写的模式打开 if (g_pp != NULL)
    { for (int i = ; i < imax; i++)
    {
    if (g_pp[i] != NULL)
    {
    char *p = strstr(g_pp[i], str);//找到返回地址,找不到返回null
    if (p != NULL)
    {
    puts(g_pp[i]);//打印
    fputs(g_pp[i], pf);//输出到文件
    }
    }
    }
    }
    fclose(pf);
    }
  • main
         loadfromfile();
    printf("Content-type:text/html\n\n");//换行 system("mkdir 1"); char szpost[] = { };
    gets(szpost);
    printf("%s", szpost); char*p1 = strchr(szpost, '&');
    if (p1 != NULL)
    {
    *p1 = '\0';
    }
    printf("<br>%s", szpost + );
    printf("<br>%s", change(szpost + )); char *p2 = strchr(p1 + , '&');
    if (p2 != NULL)
    {
    *p2 = '\0';
    }
    printf("<br>%s", p1 + );
    printf("<br>%s", change(p1 + )); search(szpost + );//检索
  • cgi格式转换
     char* change(char *str)
    {
    char *tempstr = malloc(strlen(str) + );
    int x = , y = ;
    char assii_1, assii_2;
    while (tempstr[x])
    {
    if ((tempstr[x] = str[y]) == '%')
    {
    //y+1 y+2
    if (str[y + ] >= 'A')
    {
    assii_1 = str[y + ] - ; }
    else
    {
    assii_1 = str[y + ] - ;
    }
    if (str[y + ] >= 'A')
    {
    assii_2 = str[y + ] - ;
    }
    else
    {
    assii_2 = str[y + ] - ;
    }
    tempstr[x] = assii_1 * + assii_2; y += ; }
    x++;
    y++;
    }
    tempstr[x] = '\0'; return tempstr;
    }

完整代码

 #define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<memory.h>
#include <Windows.h>
#define path "kaifang.txt" char ** g_pp;//全局的二级指针
int imax = ;//标示有多少行 //获取行数
int getimax()
{
int hang = -;
FILE *pf = fopen(path, "r");//读文件打开路径
if (pf == NULL)
{
printf("文件打开失败");
return -;
}
else
{
hang = ;
while (!feof(pf))//到了文件末尾返回1,没有返回0
{
char readstr[] = { }; fgets(readstr, , pf);//读取一行 hang++;//自增 }
fclose(pf);//关闭
return hang;
}
} char* change(char *str)
{
char *tempstr = malloc(strlen(str) + );
int x = , y = ;
char assii_1, assii_2;
while (tempstr[x])
{
if ((tempstr[x] = str[y]) == '%')
{
//y+1 y+2
if (str[y + ] >= 'A')
{
assii_1 = str[y + ] - ; }
else
{
assii_1 = str[y + ] - ;
}
if (str[y + ] >= 'A')
{
assii_2 = str[y + ] - ;
}
else
{
assii_2 = str[y + ] - ;
}
tempstr[x] = assii_1 * + assii_2; y += ; }
x++;
y++;
}
tempstr[x] = '\0'; return tempstr;
} void loadfromfile()
{ g_pp = (char **)malloc(sizeof(char*)*imax); //分配指针数组
memset(g_pp, '\0', sizeof(char*)*imax);//内存清零 FILE *pf = fopen(path, "r");//读文件打开路径
if (pf == NULL)
{
printf("文件打开失败");
return -;
}
else
{
for (int i = ; i < imax; i++)
{
char str[] = { };
fgets(str, , pf);//按行读取
str[ - ] = '\0';
int strlength = strlen(str); g_pp[i] = malloc(sizeof(char)*(strlength + ));//处理/0 if (g_pp[i] != NULL)
{
strcpy(g_pp[i], str);//拷贝到分配的内存
}
}
fclose(pf);//关闭
}
} void search(char *str)
{
char strpath[] = { };
sprintf(strpath, "I:\\%s.txt", str);
FILE *pf = fopen(strpath, "w");//写的模式打开 if (g_pp != NULL)
{ for (int i = ; i < imax; i++)
{
if (g_pp[i] != NULL)
{
char *p = strstr(g_pp[i], str);//找到返回地址,找不到返回null
if (p != NULL)
{
puts(g_pp[i]);//打印
fputs(g_pp[i], pf);//输出到文件
}
}
}
}
fclose(pf);
} void main()
{ loadfromfile();
printf("Content-type:text/html\n\n");//换行 system("mkdir 1"); char szpost[] = { };
gets(szpost);
printf("%s", szpost); char*p1 = strchr(szpost, '&');
if (p1 != NULL)
{
*p1 = '\0';
}
printf("<br>%s", szpost + );
printf("<br>%s", change(szpost + )); char *p2 = strchr(p1 + , '&');
if (p2 != NULL)
{
*p2 = '\0';
}
printf("<br>%s", p1 + );
printf("<br>%s", change(p1 + )); search(szpost + );//检索
}

81.内存模式实现cgi查询的更多相关文章

  1. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中 ...

  2. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  3. C++(十八) — 内存模式、堆和栈

    1.内存模式 一个程序执行时,先复制到内存,然后CPU逐句读取指令执行. 每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的.比如:一台计算机256MB内存,则有256* ...

  4. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

  5. apache中配置php支持模块模式、cgi模式和fastcgi模式

    首先安装apache.mysql和php,依次顺序安装. 1.apache.mysql的安装比较简单,略过 2. php的安装,我安装的是php5.3.6内置了php-fpm,所以不需要再单独下补丁了 ...

  6. apache中配置php支持模块模式、cgi模式和fastcgi模式的实验

    首先安装apache.mysql和php,依次顺序安装. 1.apache.mysql的安装比较简单,略过 2. php的安装,我安装的是php5.3.6内置了php-fpm,所以不需要再单独下补丁了 ...

  7. Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)

    刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...

  8. jvm运行时内存模式

    jvm内存模型 内存模型粗略划分为:堆和栈 详细划分为:堆,虚拟机栈,方法区,本地方法区,程序计数器 程序计数器: 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程 ...

  9. Java内存模式

    Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式. JVM是Java Virtual Machine(Java ...

随机推荐

  1. Cisco交换机IOS配置介绍

    一.模式• 用户模式(>):• 特权模式(#):• 全局配置模式(config#):• 接口配置模式(config-if#):• 线路模式(#config-line): 二.基本IOS命令结构• ...

  2. Perl线程介绍

    Perl 中的线程 本文首先概述了线程的概念和意义,接着回顾了 Perl 语言中对线程支持的演化历史,然后通过一系列示例重点介绍了 Perl 中线程的实现,数据的共享以及线程间的同步,最后归纳并总结了 ...

  3. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

  4. Mybatis使用注解进行增删改查

    // 增public interface StudentMapper{ @Insert("insert into student (stud_id, name, email, addr_id ...

  5. ItelliJ IDEA开发工具使用—创建一个web项目(转)

    最近想用IDEA编辑器开发,但是平时都用MyEclipse和eclipse习惯了,突然间用IDEA到处碰壁的感觉.在不断的摸索之后终于苦尽甘来,学会了基本的web程序如何创建以及运行了.期间在网上找了 ...

  6. 洛谷 P1889 士兵站队

    P1889 士兵站队 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军 ...

  7. android应用开发-从设计到实现 3-9 Origami动态原型设计

    动态原型设计 动态的可交互原型产品,是产品经理和界面设计师向开发人员阐释自己设计的最高效工具. 开发人员不须要推測设计师要什么样的效果,照着原型产品做就好了. 非常多创业团队也发现了产品人的这个刚需, ...

  8. OpenCASCADE 麻花钻头造型实例分析

    OpenCASCADE 麻花钻头造型实例分析 eryar@163.com Abstract. OpenCASCADE provides a simple twist drill bit modelin ...

  9. 不仅仅是MVC

    MVC Smart MV Three tier 等等

  10. javafx HTMLEditor

    public class EffectTest extends Application { //===================== private final String INITIAL_T ...