傻瓜翻译程序

在今年的一个公司的实习招聘的试题中,遇到了实现一个简单的翻译字典的程序,现在写出来,和大家分享一下。大笑

有一个弱智的翻译程序,它接收一个文本文件作文输入源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:"<
     
     
      
      <
      
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值