#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#pragma warning(disable:4996)
typedef struct
{
char *content;//用于记录txt奇数行内容首地址
char *translate;//用于记录txt偶数行内容首地址
} word;
int opencasio(word **str, const char* filename, int *num)//打开文件并读取内容 返回词条数num
{
FILE *p = fopen(filename, "r");
if (p)
{
char buf[1024] = { 0 };
int i = 0;//记录字典的单词数
int l = 0;
while (!feof(p))
{
i++;
*str = (word *)realloc(*str, i*sizeof(word));//根据单词数分配内存
memset(*str + i - 1, 0, sizeof(word));//清空新分配内存的结构内容
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), p);
l = strlen(buf);
(*str)[i - 1].content = (char *)calloc(l, sizeof(char));//根据txt文件行的大小分配content大小 变l
strcpy((*str)[i - 1].content, &buf[1]);//将txt文件内容导入结构数组
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), p);
l = strlen(buf);
(*str)[i - 1].translate = (char *)calloc(l, sizeof(char));//根据txt文件行的大小分配translate大小
strcpy((*str)[i - 1].translate, &buf[6]);//将txt文件内容导入结构数组
//printf("w[%d].content = %s\n", i, (*str-1)[i].content);
//printf("w[%d].translate = %s\n", i, (*str-1)[i].translate);
}
*num = i;
fclose(p);
return 0;//0成功打开文件
}
else
return 1;//未能打开文件
}
int lookup(const char *wantcontent, char *wanttranslate, int num, word *str)//查单词
{
int i;
for (i = 0; i < num; i++)
{
if (0 == strncmp(str[i].content, wantcontent, strlen(wantcontent))) //必须strncmp,不然最后有个\n!!!太坑
{
strcpy(wanttranslate, str[i].translate);
return 0;
}
}
return 1;//0查到相关词条 1未查到
}
int freeword(word *str, int num)//释放分配的内存
{
int i;
for (i = 0; i < num; i++)
{
free(str[i].content);
free(str[i].translate);
}
free(str);
return 0;
}
int main(int argc, char *args[])//int argc,char *args[]
{
word *str = NULL;
int num = 0;
if (argc < 2)
printf("USAGE: %s filename\n", args[0]);
long open1 = 0L;
long open2 = 0L;
open1 = clock();
if (0 == opencasio(&str, args[1], &num))
{
open2 = clock();
printf("open_dict used %ld ms\n", open2 - open1);
}
else
{
printf("CAN NOT OPEN FILE!\n");
return 0;
}
char wantcontent[1024] = { 0 };
char wanttranslate[1024] = { 0 };
while (1)
{
memset(wantcontent, 0, sizeof(wantcontent));
memset(wanttranslate, 0, sizeof(wantcontent));
scanf("%s", wantcontent);
if (0 == strcmp("BIUBIUBIU", wantcontent))//输入BIUBIUBIU关闭字典为什么会报错
break;
if (0 == lookup(wantcontent, wanttranslate, num, str))
printf("%s\n", wanttranslate);
else
printf("NOT FOUND!\n");
}
long free1 = 0L;
freeword(str, num);
long free2 = 0L;
printf("open_dict used %ld ms\n", free2 - free1);
return 0;
}
字典是以下格式的txt文件:
#a
Trans:art. 一;字母A
#a.m.
Trans:n. 上午
#a/c
Trans:n. 往来帐户@往来:come - and - go; contact; intercourse@n. 往来帐户
#aardvark
Trans:n. 土猪
这是我用C语言写的一个字典程序用来查奇数行的内容显示偶数行的内容
这个程序在字典的txt文件很小的时候可以很顺利地运行
但是在字典的txt文件很大的时候查询没问题,但在输入BIUBIUBIU退出或者运行代码不加txt文件名的时候DOS会报错卡死
第一张是4M的txt,第二张就是只有四个单词的txt
我是C语言新手,最近刚自学的,麻烦大家帮我看一下是代码哪里有问题?要怎么修改?谢谢大家!
求各位大大帮忙!告诉我一下我应该怎么修改!