Feb 14
trans程序的源代码在Msys下用gcc编译调试通过。
使用说明:trans [-r/-s] srcfile objfile
其中,-R 将摩斯码翻译成英文;
-S 将英语翻译成摩斯码。
srcfile为需要翻译的文本文件。运行成功后结果会保存在objfile文件中。
注意:若是翻译英文,须保证所有字母均为大写字母。且标点符号仅可为“.”和“,”
代码已上传至github https://github.com/longqzh/MorseCode_Translator
/* ******************************* * * Translator for Morse Code * * Author: Long Qianzhi * Date:2010/1/28 * * *******************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 39 struct table{ char letter; char mor[8]; }table[]={ {'A',".-"},{'B',"-..."},{'C',"-.-."}, {'D',"-.."},{'E',"."},{'F',"..-."}, {'G',"--."},{'H',"...."},{'I',".."}, {'J',".---"},{'K',"-.-"},{'L',".-.."}, {'M',"--"},{'N',"-."},{'O',"---"}, {'P',".--."},{'Q',"--.-"},{'R',".-."}, {'S',"..."},{'T',"-"},{'U',"..-"}, {'V',"...-"},{'W',".--"},{'X',"-..-"}, {'Y',"-.--"},{'Z',"--.."},{'0',"-----"}, {'1',".----"},{'2',"..---"},{'3',"...--"}, {'4',"....-"},{'5',"....."},{'6',"-...."}, {'7',"--..."},{'8',"---.."},{'9',"----."}, {'.',".-.-.-"},{',',"--..--"},{' ',".--.-."}, {'\n',""} }; FILE *infp=NULL, *outfp=NULL; void check_file(char *in, char *out) { if((infp=fopen(in,"r"))==NULL){ printf("\nCan't open source file : %s\n", in); exit(1); } else if ((outfp=fopen(out,"w"))==NULL){ printf("\nCan't open output file : %s\n", out); exit(1); } return; } int file_size(FILE *fp) { int fsize=0; char c; while((c=fgetc(fp))!=EOF) fsize++; rewind(fp); return fsize; } char* make_buf(int n) { char *pstr; pstr=(char *)malloc(n*sizeof(char)); if(pstr==NULL){ printf("\nMalloc failed!\n"); exit(1); } return pstr; } void m2t() { char *buffer; int fnum,n=0,i=0; char tmp[8]=""; /* Read all of the data from srcfile to buffer.*/ fnum=file_size(infp); buffer=make_buf(fnum+1); if((fread(buffer,sizeof(char),fnum,infp))!=fnum){ printf("\nSomething wrong about reading file!\n"); exit(1); } *(buffer+fnum)='\0'; fclose(infp); printf("%s\n",buffer);fflush(stdout); while(*buffer!='\0'){ /* Read a word from buffer to tmp.*/ while(*buffer!=' ' && *buffer!='\0'){ tmp[n++]=*buffer++; if(n>7){ tmp[7]='\0'; printf(" %s : Bad MorseCode!\n", tmp); exit(1); } } tmp[n]='\0'; n=0; printf("%s\t",tmp);fflush(stdout); while(strcmp(tmp,table[i++].mor)){ if(i>=MAX && *(buffer+1)!='\0'){ printf(" %s : CANNOT find it!\n", tmp); exit(1); } } fputc(table[--i].letter,outfp); printf("%c\t",table[i].letter);fflush(stdout); i=0; buffer++; } fclose(outfp); printf("The translated file is created.\n"); fflush(stdout); } void t2m() { char *buffer; int fnum,i=0; /* Read all of the data from srcfile to buffer.*/ fnum=file_size(infp); buffer=make_buf(fnum+1); if((fread(buffer,sizeof(char),fnum,infp))!=fnum){ printf("\nSomething wrong about reading file!\n"); exit(1); } *(buffer+fnum)='\0'; fclose(infp); printf("%s %d\n", buffer,(int)(*buffer));fflush(stdout); while(*buffer!='\0'){ /* find the MorseCode according to character.*/ while(*buffer!=table[i].letter){ i++; fflush(stdout); if(i>MAX && *buffer!=EOF){ printf(" %c %d: Bad character\n", *buffer,(int)(*buffer)); exit(1); } } buffer++; printf("%c-->%s\t\n",table[i].letter,table[i].mor);fflush(stdout); fputs(table[i].mor,outfp); fputc(' ',outfp); i=0; } fclose(outfp); printf("The translated file is created.\n"); fflush(stdout); } int main(int argc,char *argv[]) { if (argc!=4){ printf("Usage: trans [-R/-S] srcfile outfile\n"); printf("\n\t -r translate Morse to English."); printf("\n\t -s translate English to Morse."); printf("\n\t -h show this help information.\n"); fflush(stdout); return 1; } if (!strcmp(argv[1],"-r") || !strcmp(argv[1],"-R")){ check_file(argv[2],argv[3]); m2t(); } else if (!strcmp(argv[1],"-s") || !strcmp(argv[1],"-S")){ check_file(argv[2],argv[3]); t2m(); }else{ printf("You input wrong arguments!\n"); printf("Please type \"trans -h\".\n"); fflush(stdout); } return 0; }