文件操作小案例

目录

四则运算

英汉翻译


四则运算

这段代码实现了一个简单的四则运算文件操作案例。

功能描述

  1. 生成四则运算表达式文件 (c_data() 函数):

    • 该函数用于生成包含随机四则运算表达式的文本文件 四则运算.txt
    • 每个表达式由两个随机整数和一个随机运算符(+、-、*、/)组成。
    • 具体步骤:
      • 使用 srand(time(NULL)); 初始化随机数种子,以确保每次生成的随机数不同。
      • 使用 fprintf(fp,"%d%c%d=\n",a,str[c],b); 将每个表达式写入文件,其中 a 和 b 是随机生成的操作数,str[c] 是随机选择的运算符。
  2. 读取并处理四则运算表达式 (read_data() 函数):

    • 该函数读取 四则运算.txt 中的表达式,计算其结果,并将结果更新到文件中。
    • 具体步骤:
      • 使用 fgets(buf,sizeof(buf),fp); 逐行读取文件中的表达式到缓冲区 buf
      • 使用 sscanf(buf,"%d%c%d=\n",&a,&c,&b); 解析每行表达式,获取操作数和运算符。
      • 根据运算符进行相应的数学运算,并将结果保存到 count 变量中。
      • 使用 sprintf(cmd[i++],"%d%c%d=%d\n",a,c,b,count); 将计算结果格式化为字符串,并存储在 cmd 数组中。
  3. 更新文件内容:

    • 在读取完所有表达式并计算完成后,重新打开 四则运算.txt 文件,并将计算后的结果写回文件中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define calc_num 10

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

void c_data()
{
    FILE *fp = open_file("./四则运算.txt", "w");
    srand(time(NULL));
    int a = 0;
    int b = 0;
    int c = 0;
    char str[4] = {'+','-','*','/'};
    for(int i = 0; i < calc_num; i ++)
    {
        a = rand()%100 + 1;
        b = rand()%100 + 1;
        c = rand()%4;
        fprintf(fp,"%d%c%d=\n",a,str[c],b);
    }
    fclose(fp);
}

void read_data()
{
    FILE *fp = open_file("./四则运算.txt", "r");
    int a = 0;
    int b = 0;
    char c = 0;
    int count = 0;
    int i = 0;
    char buf[1024] = "";
    char cmd[calc_num][128] = {0};
    char *p = NULL;
    while (1)
    {
        p = fgets(buf,sizeof(buf),fp);
        if(p == NULL)
            break;
        sscanf(buf,"%d%c%d=\n",&a,&c,&b);
        switch (c)
        {
        case '+':
            count = a + b;
            break;
        case '-':
            count = a - b;
            break;
        case '*':
            count = a * b;
            break;
        case '/':
            count = a / b;
            break;
        default:
            break;
        }
        sprintf(cmd[i++],"%d%c%d=%d\n",a,c,b,count);
    }
    fclose(fp); // 关闭文件

    FILE *fp1 = open_file("./四则运算.txt", "w");
    for(int i = 0; i < calc_num; i ++)
    {
        fprintf(fp1,"%s",cmd[i]);
    }
    fclose(fp1); // 关闭文件
}

int main()
{
    
    c_data();
    read_data();

    return 0;
}

英汉翻译

这是一个简单的英汉词典程序,通过命令行输入英文单词来查找对应的中文翻译。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define dict_num 43083  // 定义词典中词条的数量

// 定义词典条目结构体
typedef struct dict
{
    char *key;      // 英文单词
    char *content;  // 中文翻译
} DICT;

// 打开文件的函数,返回文件指针
FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);  // 使用指定模式打开文件
    if (!fp)
    {
        perror("打开失败");  // 如果打开失败,打印错误信息
        return NULL;
    }
    return fp;  // 返回文件指针
}

// 过滤字符串末尾的空白字符
void filter_buf(char *buf)
{
    int n = strlen(buf) - 1;  // 获取字符串长度
    while (n >= 0 && (buf[n] == ' ' || buf[n] == '\n' || buf[n] == '\r' || buf[n] == '\t'))
        n--;  // 去除末尾的空白字符
    buf[n + 1] = '\0';  // 添加字符串结束符
}

// 初始化词典,从文件中读取数据到内存中的结构体数组中
void dict_init(DICT **temp)
{
    DICT *p = malloc(sizeof(DICT) * dict_num);  // 分配存储词典的内存空间
    if (p == NULL)
    {
        perror("内存分配失败");  // 如果内存分配失败,打印错误信息
        exit(EXIT_FAILURE);  // 退出程序
    }

    FILE *fp = open_file("dictionary.txt", "r");  // 打开词典文件
    if (!fp)
    {
        fprintf(stderr, "无法打开字典文件\n");  // 如果打开失败,打印错误信息
        exit(EXIT_FAILURE);  // 退出程序
    }

    char buf[1024];  // 用于存储读取的每行数据的缓冲区
    int i = 0;
    while (fgets(buf, sizeof(buf), fp))
    {
        filter_buf(buf);  // 过滤掉读取行末尾的空白字符
        p[i].key = malloc(strlen(buf) + 1);  // 分配存储英文单词的内存空间
        if (p[i].key == NULL)
        {
            perror("内存分配失败");  // 如果内存分配失败,打印错误信息
            exit(EXIT_FAILURE);  // 退出程序
        }
        strcpy(p[i].key, buf + 1);  // 将读取的英文单词复制到结构体数组中,跳过开头的空格

        fgets(buf, sizeof(buf), fp);  // 继续读取下一行,即中文翻译的内容
        filter_buf(buf);  // 过滤掉末尾的空白字符
        p[i].content = malloc(strlen(buf) + 1);  // 分配存储中文翻译的内存空间
        if (p[i].content == NULL)
        {
            perror("内存分配失败");  // 如果内存分配失败,打印错误信息
            exit(EXIT_FAILURE);  // 退出程序
        }
        strcpy(p[i].content, buf + 6);  // 将读取的中文翻译复制到结构体数组中,跳过开头的空格和冒号

        i++;  // 继续处理下一条词典条目
    }
    fclose(fp);  // 关闭文件
    *temp = p;  // 将词典数组指针传递给调用者
}

// 查找词典中是否存在指定的英文单词,如果找到则将对应的中文翻译拷贝到content中
int search_dict(char *cmd, DICT *dict, int n, char *content)
{
    for (int i = 0; i < n; i++)
    {
        if (strcmp(cmd, dict[i].key) == 0)  // 比较输入的英文单词和词典中的每个条目的单词
        {
            strcpy(content, dict[i].content);  // 如果匹配成功,复制对应的中文翻译到content中
            return 1;  // 返回找到结果
        }
    }
    return 0;  // 如果未找到,则返回0
}

// 主函数,程序入口
int main()
{
    DICT *dict = NULL;  // 定义词典结构体指针
    dict_init(&dict);  // 初始化词典,从文件中读取数据

    char cmd[128];  // 用户输入的英文单词存储数组
    char content[128];  // 查找到的中文翻译存储数组
    int ret;  // 搜索结果标志

    while (1)
    {
        printf("请输入需要翻译的单词:\n");  // 提示用户输入英文单词
        fgets(cmd, sizeof(cmd), stdin);  // 从标准输入读取用户输入
        cmd[strcspn(cmd, "\n")] = '\0';  // 去除输入字符串末尾的换行符

        ret = search_dict(cmd, dict, dict_num, content);  // 在词典中搜索输入的英文单词
        if (ret)
        {
            printf("翻译为:%s\n", content);  // 如果找到,输出对应的中文翻译
        }
        else
        {
            printf("未找到翻译结果。\n");  // 如果未找到,提示未找到结果
        }
    }

    // 释放词典中每个条目占用的内存空间
    for (int i = 0; i < dict_num; i++)
    {
        free(dict[i].key);
        free(dict[i].content);
    }
    free(dict);  // 释放词典结构体数组占用的内存空间

    return 0;  // 程序正常退出
}

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值