C語言寫快易通

快易通文本文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>



typedef struct 
{
    char *key;
    char *content;//用堆了,省內(nèi)存
}dict;

//打開字典文件,并讀取文件內(nèi)容
int open_dict(dict **p,const char *dict_filename)
{
    FILE *pfile = fopen(dict_filename,"r");
    if (pfile == NULL)return 0;
    
    *p = (dict*)malloc(sizeof( dict));//固定分配MAX大小內(nèi)存
    memset(*p,0,sizeof(dict));//將分配內(nèi)存初始化為0

    char buf[1024] = {0};
    size_t len = 0;
    int i = 0;//計數(shù)器

     while(!feof(pfile))//循環(huán)讀取文件,知道文件結(jié)尾
        {
            memset(buf,0,sizeof(buf));
            fgets(buf,sizeof(buf),pfile);
            len = strlen(buf);
            if(len > 0)
            {
                (*p)[i].key = (char *)malloc(len);//把key值輸入
                memset((*p)[i].key,0,len);
                strcpy((*p)[i].key,&buf[1]);//第一個字為#,不錄入
            }

            memset(buf,0,sizeof(buf));
            fgets(buf,sizeof(buf),pfile);
            len = strlen(buf);

            if (len > 0)
            {
                (*p)[i].content = (char*)malloc(len);
                memset((*p)[i].content,0,len);
                strcpy((*p)[i].content,&buf[6]);//前6個字節(jié)不錄入
            }

            i++;

            *p = ( dict *)realloc(*p,(1 + i) *sizeof(dict));//動態(tài)增加內(nèi)存!
            memset(*p + i,0,sizeof(dict));//清空最后一個
        }
        fclose(pfile);
        return i;
}


int search_dict(const dict *p,int size,const char *key,char *content)
{//通過key值,返回content的內(nèi)容,并用01表示是否成功

    int i = 0;
    for (int i = 0; i < size; ++i)
    {
        if ((p[i].key == NULL) || (p[i].content == NULL))   continue;
        
        if (strncmp(p[i].key,key,strlen(key)) == 0)
        {
            strcpy(content,p[i].content);//strcpy是兩個都是char *類型
            return 1;
        }
    }
    return 0;
}

void free_dict(dict *p,int size)//循環(huán)釋放堆內(nèi)存
{
    for (int i = 0; i < size; ++i)
    {
        if (p[i].key)
            free(p[i].key);
        if (p[i].content)
            free(p[i].content);
    }
    free(p);
}

int main(int argc, char const *argv[])
{
    if (argc < 2)
    {
        printf("usage: %s dict filename\n",argv[0] );
        return 0;
    }

    long start_ms = 0;
    long end_ms = 0;
    dict *p = NULL;
    start_ms = clock();
    int dict_size = open_dict(&p,argv[1]);
    if (dict_size == 0)
        return 0;

    end_ms = clock();
    printf("open_dict used %ld ms\n",end_ms - start_ms );

    char key[2048];
    char content[2048];
    while(1)
    {
        memset(key,0,sizeof(key));
        memset(content,0,sizeof(content));
        scanf("%s",key);//輸入key值
        if (strncmp(key,"command=exit",12)==0)
        {
            break;
        }
        start_ms = clock();
        if (search_dict(p,dict_size,key,content))
        {
            printf("%s\n",content );
        }else
        {
            printf("not found\n");
        }
        end_ms = clock();
        printf("search_dict used %ld ms\n",end_ms - start_ms);
    }
    start_ms = clock();
    free_dict(p,dict_size);
    end_ms = clock();
    printf("free_dict used %ld ms\n",end_ms - start_ms );


    return 0;
}

效果圖:


1.png

PS:電腦一般不自配gcc編譯,可以用VS或者VC編譯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,753評論 25 709
  • 由于公司的項目數(shù)據(jù)庫方面使用的是Realm,以前只用過coreData Sqlite,所以花了一下午的時間去簡單的...
    AllenZYQ閱讀 2,313評論 0 5
  • 最近情緒很低落,不開心的小妖怪們來了一波又一波。 今天跟Judy稍稍聊了下天。J是一個挺勇敢地去追逐自己想要的生活...
    endgirlfriend閱讀 219評論 0 0
  • 今天沒什么可寫的,就發(fā)發(fā)牢騷吧。 最近有些感慨,你喜歡的別人不一定要喜歡 ,別人喜歡的你也不一定喜歡 。所以要去尊...
    渦孩緹閱讀 184評論 0 0
  • 他是一個很有才華的人,初識他是因為他的一首詞,那時我還在上初中,并不能理解他詞中豐富而復(fù)雜的情感。多年后喜歡上了他...
    yh十三閱讀 215評論 0 0

友情鏈接更多精彩內(nèi)容