文章目录
- 前言:可以学到什么?
- 一、功能介绍以及演示
- 二、准备工作
- 1)准备所需的单词的文本
- 2)任意的C语言开发环境
- 三、代码
- 1)读取文件,不存在则爆出异常
- 2)开辟空间来存放读取出来的内容
- 3)完成函数--从文件中读取英文,写入到en_buffer
- 4)完成函数--从文件中读取中文,写入到ch_buffer
- 5)利用死循环完成输入以及判断的逻辑
- 四、代码细节
- 1)文件每行的末尾含有\r和\n两个字符
- 2)getChinese函数中的if判断
- 总结
- 附:源码地址
前言:可以学到什么?
- 加强基础语法的掌握
- 关于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)开辟空间来存放读取出来的内容
// 记录当前定位的位置信息,方便下次打开的时候直接读取
// 相当于是保存记录
unsigned long long seck_en = 0;
unsigned long long 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
void getEnglish(char* en_buffer, FILE* pf_en, long long* 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
void getChinese(char* ch_buffer, FILE* pf_ch, long long* 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;} else if (strcmp(usr_buffer, en_buffer) == 0) {// 输入正确printf("恭喜输入正确!\n");printf("2秒后清屏\n");Sleep(2000);system("cls");break;} else if (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语言分文件的版本
附:源码地址
源码地址,内含源码