mydic

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define BUF_LEN 1024
#define WORD_LEN 50
#define WORD_TRANS_LEN 1024

typedef struct{ 
	char *key;
	int n_trans;
	char **trans;
}word_t;

typedef struct node{
	word_t word;
	struct node *next;
}node_t;


void creat_bat(char *filename)
{
	char buf[BUF_LEN], word_str[WORD_LEN], word_trans[WORD_TRANS_LEN], word_one_trans[WORD_TRANS_LEN];
	FILE *fp, *fp_dat;
	int count = 0, total_word = 0; // total_word 词库单词个数  count 词条翻译个数
	int key_n = 0, trans_n = 0, one_trans_len = 0; //trans_n 词条的翻译个数 key_n 单词的长度 one_trans_len 一个翻译的长度
	char *count_p, *ret; //统计词条翻译个数, 临时指针变量
	int i;

	fp = fopen(filename, "r");
	if(fp == NULL){
		printf("open fail\n");
		exit(1);
	}

	fp_dat = fopen("dict.dat", "w");
	if(fp_dat == NULL){
		printf("open dict.dat fail\n");
		exit(1);
	}

	//total all words
	while( fgets(buf, BUF_LEN, fp) != NULL){
		if(buf[0] == '#'){
//<F12>		printf("%s\n", buf);
			total_word++;
		}
	}

	rewind(fp);

//<F12>	printf("totul:%d\n", total_word);

	//将单词总数写入dat
	fwrite(&total_word, sizeof(int), 1, fp_dat);

	while(fgets(buf, BUF_LEN, fp) != NULL){
		count = 0;
		if(buf[0] == '#'){
			strcpy(word_str, buf + 1);
		}
		word_str[strlen(word_str) - 1] = '\0';

		key_n = strlen(word_str);
		fwrite(&key_n, sizeof(int), 1, fp_dat); //写入单词长度
		printf("word_len:%d\n", key_n);
		fwrite(word_str, key_n + 1, 1, fp_dat); //写入单词内容
		printf("word:%s\n", word_str);
		
		fgets(buf, WORD_TRANS_LEN, fp); //读取文本词库翻译行
		strcpy(word_trans, buf + 6);
		word_trans[strlen(word_trans) - 1] = '\0';

		//处理在首位置或末尾的@, 中间连续的@
		if(word_trans[0] == '@'){
			word_trans[0] = ' ';
		}
		if(word_trans[strlen(word_trans) - 1] == '@'){
			word_trans[strlen(word_trans) - 1] = '\0';
		}
		for( i = 0; word_trans[i] != '\0'; i++){
			if(word_trans[i] == '@' && word_trans[i + 1] == '@' ){
				word_trans[i] = ' ';
			}
		}

		//一个词条的翻译个数
		for(count_p = word_trans; ( count_p = strchr(count_p, '@')) ; count_p++){
			count++;
		}

		trans_n = count + 1;
//<F12>		printf("%d\n", count);
		fwrite(&trans_n, sizeof(int), 1, fp_dat); //写入词条翻译个数
		printf("trans_n:%d\n", trans_n);
		ret =  strtok(word_trans, "@");  

		one_trans_len = strlen(ret);
		fwrite(&one_trans_len, sizeof(int), 1, fp_dat); //写入解释的长度
		printf("one_trans_len:%d\n", one_trans_len);
		fwrite(ret, strlen(ret) + 1, 1, fp_dat); //写入词条翻译
		printf("trans:%s\n", ret);

		while( (ret = strtok(NULL, "@")) != NULL ){
			strcpy(word_one_trans, ret);
			one_trans_len = strlen(ret);
			fwrite(&one_trans_len, sizeof(int), 1, fp_dat); //写入解释的长度
			printf("one_trans_len:%d\n", one_trans_len);
		
			fwrite(word_one_trans, strlen(word_one_trans) + 1, 1, fp_dat); //写入词条翻译
			printf("trans:%s\n", word_one_trans);
		}

	}
	fclose(fp);
	fclose(fp_dat);
}
node_t *read_file(char *filename, node_t *head)
{
	FILE *fp;
	char buf[BUF_LEN], word_str[WORD_LEN], word_trans[WORD_TRANS_LEN];
	char *ret, *count_p, *tmp; //tmp @@ 
	int count, i; //统计的翻译的词条个数, @
	fp = fopen(filename, "r");
	if(fp == NULL){
		perror("open file fail\n");
		exit(1);
	}
	
	while(fgets(buf, BUF_LEN, fp) != NULL){ //第一次读的是#开头的单词行
		count = 0;
		node_t *newp = malloc(sizeof(node_t));
		if(newp == NULL){
			printf("malloc fail\n");
			exit(1);
		}

		if(buf[0] == '#'){
			strcpy(word_str, buf + 1);
		}
	
		newp->word.key = malloc(strlen(word_str) * sizeof(char) + 1); //给char *key 开辟空间

		word_str[strlen(word_str) - 1] = '\0' ;
		strcpy(newp->word.key, word_str);
		
		fgets(buf, BUF_LEN, fp); 	//读翻译行
		strcpy(word_trans, buf + 6);
		word_trans[strlen(word_trans) - 1] = '\0';
//		printf("%s\n" ,word_trans);
		if(word_trans[0] == '@'){
			word_trans[0] = ' ';
		}
		if(word_trans[strlen(word_trans) - 1] == '@'){
			word_trans[strlen(word_trans) - 1] = ' ';	
		}

		for(i = 0; word_trans[i] != '\0'; i++){
			if(word_trans[i] == '@' && word_trans[i + 1] == '@'){
				word_trans[i] = ' ';
			}
		}


		for(count_p = word_trans; (count_p = strchr(count_p, '@')) != NULL; count_p++){
			count++;
		}
		count = count + 1; //count = 翻译的的词条数
		newp->word.n_trans = count;
		//只有一个翻译词条
		ret = strtok(word_trans, "@");
		newp->word.trans  = malloc(sizeof(char *) * count); //开辟trans[]的空间大小
		newp->word.trans[0] = malloc(sizeof(char ) * ( strlen(ret) + 1) );
		strcpy(newp->word.trans[0], ret);
//		strcpy(newp->(*trans) + count, ret);
		
		
		for( i = 1; (ret = strtok(NULL, "@")) != NULL && i < count; i++ ){
			newp->word.trans[i] = malloc(sizeof(char) * (strlen(ret) + 1));
			strcpy( newp->word.trans[i] , ret);
		}

		newp->next = head;
		head = newp;
	}
	fclose(fp);
	return head;
}


void print(node_t *head)
{
	node_t *cur;
	int i;
	for(cur = head; cur; cur = cur->next){
		printf("%s\n", cur->word.key);
		printf("%d\n", cur->word.n_trans);
		for(i = 0; i < cur->word.n_trans; i++){
			printf("%s", cur->word.trans[i]);
		}
	}

}
void search_word(node_t *head)
{
	char str[100];
	int i = 0;
	int flag = 1;
	node_t *cur;
	scanf("%s", str);
	//search word and stdout
	for( cur=head; cur; cur = cur->next){
		if(strcmp(cur->word.key, str) == 0){
			for(i = 0; i < cur->word.n_trans; i++){
				flag = 0;
				printf("%s\n", cur->word.trans[i]);
			}
			break;
		}
	}
	if(flag == 1){
		printf("Sorry, the word no find!\n");
	}
}
void search_dat(char *filename)
{
	char buf_word[100], buf_word_trans[WORD_TRANS_LEN];
	char str[100];
	int i = 0;
	int word_total = 0, word_len = 0, one_word_trans_len = 0, word_trans_n = 0;
	FILE *fpr;
	fpr = fopen(filename, "r");
	if(fpr == NULL){
		perror("open fail\n");
		exit(1);
	}
	scanf("%s", str);
	fread(&word_total, sizeof(int), 1, fpr);
//	printf("%d\n", word_total);
//	sleep(3);
	while(1){
		fread(&word_len, sizeof(int), 1, fpr);
//		printf("word_len:%d\n", word_len);
		fread(buf_word, word_len + 1, 1, fpr);
//		printf("%s\n", buf_word);
		if(strcmp(buf_word, str) == 0){
			fread(&word_trans_n, sizeof(int), 1, fpr);
			for(i = 0; i < word_trans_n; i++){
				fread(&one_word_trans_len, sizeof(int), 1, fpr);
				fread(buf_word_trans, one_word_trans_len + 1, 1, fpr);	
				printf("%s\n", buf_word_trans);
				return;
			}
		}
		if(strcmp(buf_word, str) != 0){
			fread(&word_trans_n, sizeof(int), 1, fpr);
			for(i = 0; i < word_trans_n; i++){
				fread(&one_word_trans_len, sizeof(int), 1, fpr);
				fread(buf_word_trans, one_word_trans_len + 1, 1, fpr);	
//				printf("%s\n", buf_word_trans);
			}
		}

	}
}

void menu(void)
{
	printf("----------------dic----------------\n");
	printf("-------1.word search by txt--------\n");
	printf("-------2.creat dat-----------------\n");
	printf("-------3.word search by dat--------\n");
	printf("-------0:exit----------------------\n");
	printf("-----------------------------------\n");
}

int main(void)
{
	node_t *head = NULL;
	int n;
	head = read_file("dict.txt", head);
	start:
	menu();
	scanf("%d", &n);
	if( n != 1 && n != 2 && n != 3 && n != 0 ){
		printf("Enter number wrong\n");
		goto start;
	}
	switch(n){
		case 1: 
				search_word(head);
				goto start;
		case 2:
				creat_bat("dict.txt");
				printf("creat dict.dat succeed\n");
				goto start;
		case 3:
				search_dat("dict.dat");
				goto start;

		case 0:
				break;
		default : 
				break;
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值