[小小项目]背单词的程序---1.0_纯C语言_单文件版本

文章目录

  • 前言:可以学到什么?
  • 一、功能介绍以及演示
  • 二、准备工作
    • 1)准备所需的单词的文本
    • 2)任意的C语言开发环境
  • 三、代码
    • 1)读取文件,不存在则爆出异常
    • 2)开辟空间来存放读取出来的内容
    • 3)完成函数--从文件中读取英文,写入到en_buffer
    • 4)完成函数--从文件中读取中文,写入到ch_buffer
    • 5)利用死循环完成输入以及判断的逻辑
  • 四、代码细节
    • 1)文件每行的末尾含有\r和\n两个字符
    • 2)getChinese函数中的if判断
  • 总结
  • 附:源码地址


前言:可以学到什么?

  1. 加强基础语法的掌握
  2. 关于C语言的文件读写的操作(重点)

一、功能介绍以及演示

  • 输入文本,可以判断是否正确,正确的话下一个,不正确的话提示,知道正确为止。
  • 单词不会的话可以输入next进行下一个
  • 退出的话输入end

二、准备工作

1)准备所需的单词的文本

注:以下单词来源于百度,开源,可用于学习

  • 对应的中文和英文,每行的中文英文严格的一一对应,保存在 txt 文本中,程序的实现以及对文件的读写主要靠这两个文件
    [小小项目]背单词的程序---1.0_纯C语言_单文件版本_第1张图片

  • 英文如下,每个单词占一行
    [小小项目]背单词的程序---1.0_纯C语言_单文件版本_第2张图片

  • 中文如下,单词有多个词性,但是每个中文只占一行
    [小小项目]背单词的程序---1.0_纯C语言_单文件版本_第3张图片

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语言分文件的版本

附:源码地址

源码地址,内含源码

你可能感兴趣的:(c语言)