#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;
}
mydic
最新推荐文章于 2024-10-21 18:30:52 发布