文章目录
前言:可以学到什么?
- 加强基础语法的掌握
- 关于C语言的文件读写的操作(重点)
一、功能介绍以及演示
- 输入文本,可以判断是否正确,正确的话下一个,不正确的话提示,知道正确为止。
- 单词不会的话可以输入next进行下一个
- 退出的话输入end
二、准备工作
1)准备所需的单词的文本
注:以下单词来源于百度,开源,可用于学习
- 对应的中文和英文,每行的中文英文严格的一一对应,保存在 txt 文本中,程序的实现以及对文件的读写主要靠这两个文件
- 英文如下,每个单词占一行
- 中文如下,单词有多个词性,但是每个中文只占一行
2)任意的C语言开发环境
- 需要注意的是:把上述的文本文件添加至工程
三、代码
1)读取文件,不存在则爆出异常
FILE* pf_en =fopen("./data/en.txt","r");
FILE* pf_ch =fopen("./data/ch.txt","r");
FILE* pf_mem =fopen("./data/info.txt","r");if(pf_en ==NULL|| pf_ch ==NULL|| pf_mem ==NULL){printf("必要文件丢失或被修改!\n");getchar();return-1;}
2)开辟空间来存放读取出来的内容
// 记录当前定位的位置信息,方便下次打开的时候直接读取// 相当于是保存记录unsignedlonglong seck_en =0;unsignedlonglong seck_ch =0;// 各自缓冲区char* en_buffer =(char*)calloc(50,1);char* ch_buffer =(char*)calloc(300,1);char* usr_buffer =(char*)calloc(50,1);
3)完成函数–从文件中读取英文,写入到en_buffer
voidgetEnglish(char* en_buffer, FILE* pf_en,longlong* seck_en){char ch =0;for(int i =0;(ch =fgetc(pf_en))!='\n'; i++){
en_buffer[i]= ch;// 每读取到一个字节,偏移量就加一*seck_en +=1;}// 把单词转换成纯小写
en_buffer =strlwr(en_buffer);// 结束时便宜两个字节,跳过回车和换行*seck_en +=2;}
4)完成函数–从文件中读取中文,写入到ch_buffer
voidgetChinese(char* ch_buffer, FILE* pf_ch,longlong* seck_ch){char ch =0;for(int i =0;(ch =fgetc(pf_ch))!='\n'; i++){// 不是首元素 且当前读取到的是字母 且前一个元素不是字母if(i >0&&isword(ch)&&!isword(ch_buffer[i -1])){// 在缓冲区内添加一个换行
ch_buffer[i++]='\n';}
ch_buffer[i]= ch;// 每读取到一个字节,偏移量就加一*seck_ch +=1;}// 结束时偏移两个字节,跳过回车和换行*seck_ch +=2;}
5)利用死循环完成输入以及判断的逻辑
while(1){// 往缓冲区里放入当前的单词和中文意思getEnglish(en_buffer, pf_en,&seck_en);getChinese(ch_buffer, pf_ch,&seck_ch);// printf("%s\n", en_buffer);//输出中文的示意printf("当前单词中文意思如下, 不会请输入next, 退出请输入end\n");printf("%s\n", ch_buffer);printf("输入英文:>");while(1){// 用户输入for(int i =0;(ch =getchar())!='\n'; i++){
usr_buffer[i]= ch;}// 输入next跳过,进行下一个if(strcmp(usr_buffer,"next")==0){printf("这个单词是:%s\n", en_buffer);printf("3秒后清屏\n");Sleep(3000);system("cls");break;}elseif(strcmp(usr_buffer, en_buffer)==0){// 输入正确printf("恭喜输入正确!\n");printf("2秒后清屏\n");Sleep(2000);system("cls");break;}elseif(strcmp(usr_buffer,"end")==0){printf("2秒后退出!\n");Sleep(2000);goto end;}else{// 清空用户的输入printf("不是哦,重新输入:>");memset(usr_buffer,0,50);continue;}}// 清空当前的缓冲区memset(en_buffer,0,50);memset(ch_buffer,0,300);memset(usr_buffer,0,50);}
四、代码细节
1)文件每行的末尾含有\r和\n两个字符
- 所以我们需要将seek往后偏移2,才可以读取下一个单词
2)getChinese函数中的if判断
if(i >0&&isword(ch)&&!isword(ch_buffer[i -1]))
- 英文的示意是有不同的词性的,于是我们可以判断一行中文中出现的非第一次英文单词作为分割,在输出中添加换行
总结
以上就是所分享的内容,本程序仅简单实现了对单词的读写以及只有用户输入功能,接下来会给大家带来C语言分文件的版本
附:源码地址
源码地址,内含源码
标签:
c语言
本文转载自: https://blog.csdn.net/Rserendipity/article/details/127434661
版权归原作者 Rserendipity 所有, 如有侵权,请联系我们删除。
版权归原作者 Rserendipity 所有, 如有侵权,请联系我们删除。