文章目录
前言:可以学到什么?
- 加强基础语法的掌握
- 关于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语言分文件的版本
附:源码地址
源码地址,内含源码