哦、、原来寒假早已通过了吗,有点迷html
做业连接ios
本次做业的github连接git
有 Microsoft Visual Studio 2017 的同窗,能够直接打开 四则运算/四则运算.sln 这个项目。否则的话麻烦请本身从新用本身的编译器编译啦,并把对应的文件放好!github
赵畅 111500206 http://www.cnblogs.com/ZCplayground/数组
胡绪佩 031602114 http://www.cnblogs.com/heihuifei/函数
此次做业的思路不难理解。同一个软件的各类语言版本,不该该写在代码里,而是要把这些语句抽出来造成“资源文件”,并且这是颇有必要作的一件事情。学习
在看做业时,老师给了一条参考连接How to: Create a Localized Version of a Resource File,在连接的底部,有一个提示,让咱们参考CultureInfo类。若是点进去看的话,就进入了无限的大坑……我和王源同窗同样,一开始也是一头扎进msdn的文档中……不少都是.Net和C#的东西。啃API的时候,也强行啃了一些代码。例如:测试
这里赞一下王源同窗,王源同窗看文档学习的能力很是强!他最后是经过啃文档,调用这些API,完成了任务,并且效果很是的不错!然而我却看不下去这些API了,因而乎就和栋哥聊了一会天……ui
什么,简单的方式???编码
仔细一想,确实也不该该为刚刚学C++的同窗们布置有着这么奇奇怪怪完成方式的任务,是我一开始的思路就被文档下面的那个CultureInfo类给导偏了。
因而乎,在C语言文件操做的基础上,我就简单地学习了一下C++的文件流操做,而且想了一些办法实现了经过文件读写来达到本次做业要求的最核心的一条要求:
当每增长一种语言时,是不可经过修改源代码及重编译的方式实现
这不只让咱们全部与用户交互的显示内容不能写在代码里,并且须要咱们想出一种新思路——不只可以让程序自动识别支持哪些语言,还能能够调用它们、显示给用户。
在代码项目的文件夹下,我新建了一个文件夹,名为 LangResourses。其中有一个文本文件叫作 LanguageList.txt,其内容如图所示,里面包含着所支持各类语言的名字。用户能够经过输入这些语言的名字来选择须要的版本。程序识别用户输入的语言后,能够打开对应的文件,调用对应的“资源”(虽然没放到.rc文件中)。
而下面的是文本文件 中文.txt 和 English.txt 的内容。同一行的内容意思是同样的,只不过是所使用的语言不一样(这是一个核心操做)。其他的文件中是其余语言的翻译版本(你们能够clone下来看看)。
我主要是在以前的版本上进行迭代。会显示与用户交互信息的一些函数都有作修改,例如输入检测、答案断定、结果输出等等。最重要的是多了一个头文件LanguageResource.h。其中包含了如下内容:
最重要的关键一步是得到某个语言资源中的文件。原本我是这样想的:因为fgets这个函数,使用过一次,可使得光标停留在下一行开头。下一次调用fgets时,就能够读取下一行。因此说,我能够在txt文件中按照顺序排列好一些文段,而后不断地使用fgets就能够。可是,在我以前的代码中包括了输入检测的模块,这就意味着不能按照上面那个思路来(由于可能屡次输出相同的内容)。我也不想放弃这个输入检测模块,这个模块对于要给用户使用的程序来讲很是重要。更况且,用户输入的题目数量也不必定,用fgets直接一行行输出的思路是行不通的。
最后,我想到了预先读取txt文件中的内容,把内容存到一个指针数组里。经过控制下标i,让相同的下标表明相同的内容。对应在不一样的文件中,就是相同的行数表明相同的内容,只是语言版本的不一样。核心代码以下:
/*根据正确的语言文档路径,取得其中的内容以便使用。存放到全局指针数组Resource中*/ void GetResource(char * filepath) { fstream File; File.open(filepath, ios::in); char one_Line[MAXLEN]; /*将每行文件的内容放到Resource[i]中,这样能够经过下标i访问各类语句*/ int i; for (i = 0; File.getline(one_Line, MAXLEN); i++) { Resource[i] = (char *)malloc(MAXLEN * sizeof(char)); strcpy_s(Resource[i], MAXLEN * sizeof(char), one_Line); } File.close(); }
(这里的对齐,简直强迫症福利,但传到github上就乱了,心很累)
3)程序实现和结果测试的截图
第一个图展现了中文版本。上个版本已有的输入检测就不展现截图了。(在尚未选择语言的时候,使用的界面语言是英语)
第二个图展现了日文版本,顺带一提,输入语言时我也写了输入检测,若是用户输入了不支持的语言或者输入错误,会让用户从新输入一次。但也能够经过输入e来退出。
4)提交日志截图
5)两位同窗的分工和协做证据截图
胡同窗因为文件操做没时间学会,又临近deadline,因此此次的全部工做都是由我来完成的。
上面也提到了,一开始被文档的导向吸引,因此思路很狭窄。后面也是跟栋哥聊天才发现不对……最后想出来一个还不错的方式。经过这种方式能够比较好的学习C++文件流,也能够复习(若是不会的话就是学习)一下指针数组的用法。
此次完成的做业一样有不足。原本是有想出来一个问题的:
因此有考虑寻找一下C语言或者C++中,可以支持Unicode编码的方法。然而查找了不少资料,试过了不少方法,依旧失败。最坑爹(浪费了不少精力)的当属wfstream流和wchar_t(宽字符)。对于宽字符的正确输出方式,虽然说网上有不少人写了转换函数之类,然而这东西涉及编码规则,有不少位运算。在对Unicode编码不是特别了解的状况下,最后我仍是放弃使用这种机制。后来王源同窗找到msdn文档说fopen有打开Unicode文本文件的功能,我编码一番确实能够。但从文件输出文字依然困扰着我,因而我就放弃了。
最后的解决方案:在法语翻译的时候,用了不是特别标准的(百度)翻译,内容是ANSI字符的(其余用的是Google翻译)。
在编码时,有一点体会:在上一次做业时,把接口写好、模块分好。在此基础上,给本身迭代版本时带来了必定的方便性。若是偷懒不把这块工做作好(例如注释、接口什么的),那么软件的可维护性会不好。
另外,把嵌在代码中的用户交互语言删除,换成调用资源的写法,让整个代码看起来清爽许多,而且若是要添加新的语言的版本,更新资源的内容便可。
如下是msdn文档的一些API:
一些文件操做:
其余: