在今年的一个公司的实习招聘的试题中,遇到了实现一个简单的翻译字典的程序,现在写出来,和大家分享一下。
有一个弱智的翻译程序,它接收一个文本文件作文输入源source.txt,通过查找给定的字典dictionary.txt,进行一一对应的翻译,并讲翻译结果输出到指定的文件out.txt。对于输入的内容,如果在字典中能找到对应的翻译,则输出翻译后的词条,否则原样输出。
字典存储为一个文本文件,每一行表示一个词条,源词条和翻译之间用逗号分隔,例如,如果有下面这个字典:
hello,你好
world,世界
当输入“hello world!”,翻译器输出“你好 世界!”,当输入“hello Blog!”,则·输出“你好 Blog!”。
1.实现这样子一个翻译程序,读入待翻译的文件和词典文件,输出翻译结果到out.txt文件中
2.要求字典的条目不限于单词(word),还可以是短语(phrase),
例如字典:
come,来
come out,出现
out,外面的
当输入的源文档中有“come out”时,应翻译为“出现”,而不是“来,外面的”
这个题目其实也不算难,主要考核了对文档的读写操作的函数。例如getline();open();close();tellg()等等
在用程序实现这个功能的时候,总结了一些经验教训,希望这些经验对大家有用:
1.在着手编程序前,先把程序的流程图给弄清楚,画出来。这样子,当思路清晰了,剩下的就只有用哪种编程语言实现了。
2.编写复杂的程序,尽量分模块实现不用的功能,一个小函数实现一个功能。这样子方便调试。
3.在调用getline(字符数组/字符指针,字符个数n,终止标志字符)时,该函数读取n-1个字符,赋给指定的字符数组,如果在读取n-1个字符之前遇到了指定的终止字符, 则提前结束读取。这个函数会自作聪明,会在数组最后加入一个0(null)来标志数组的结束。
char a[50];
int i;
ifstream infile("source.txt",ios::in);
for(i=0;i<50;i++)
a[i]='@';
a[49]=0;//null
infile.getline(a,50,'/n');//读取出来的字符个数为n个(n<=50),
//例如读出了一个单词“hello”,4个字符
cout<
a[4]为字母o(ASCII码111);a[5]为空(ASCII码000);a[6]为字符@(ASCII码064)
在编这个程序的时候,我遇到了一个暂时无法解决的问题,希望各位高手支招:
当一个读一个文件读到文件最后时即file.eof()为真时,无法通过函数seekg(偏移值,ios::beg)来改变文件指针的位置。
ifstream infile("source.txt",ios::in);
while(!infile.eof())//如果没有到文件最后,就继续读文件
infile.getline(a,50,'/n');//读取文件中的一行;
infile.seekg(ios::beg);// 错误,在这里不知道为什么不能够再次把文件指针设置到文件开头,请高手赐教。
问题已经得到高手(Lucas_Hsueh)的指点,解决办法如下:
dictionaryFile读完后的EOF标记需要用infile.clear()清除,不然永远进不了while内部。
在文章的最后,给出鄙人的程序运行结果、流程图和源代码。源文件可以点击这里下载。个人能力有限,难免有错漏的地方,欢迎大家指出,谢谢!
//main
#include
#include
#include"translate_source.h"
using namespace std;
//打开需要用到的文档
ofstream outFile("out.txt",ios::out);
ifstream sourceFile("source.txt",ios::in);
ifstream dictionaryFile("dictionary.txt",ios::in);
int main()
{
int i,location;
char sourceArryNew[200],sourceArryTem[200],sourceArryOld[200];
//自定义函数声明
int isFound(char * word);
void copyArray(char *to,char * from);
void addArray(char * sum,char *num1,char * num2);
void outputMeaning(char * word);
//初始化数组
for(i=0;i<200;i++)
{
if(199!=i)
{
sourceArryNew[i]='@';
sourceArryOld[i]='@';
sourceArryTem[i]='@';
}
else
{
sourceArryNew[i]=0;//0(null)数组结束标识符
sourceArryOld[i]=0;
sourceArryTem[i]=0;
}
}//for
//如果文件打开失败,则报错
if(!sourceFile)
{cerr<<"open sourceFile error";exit(1);}
if(!dictionaryFile)
{cerr<<"open dictionaryFile error";exit(1);}
if(!outFile)
{cerr<<"open outFile error";exit(1);}
//cout<<"open sucesse";
//开始查找单词
while(!sourceFile.eof())
{
sourceFile.getline(sourceArryNew,200,' ');//在source源文件中读出一个单词
cout<<"get word sourceArryNew:"<
<