当前位置: 首页 > news >正文

携手并进 合作共赢上海seo优化培训机构

携手并进 合作共赢,上海seo优化培训机构,企业网站建设费在会计上,济南企业建站品牌本文将介绍操作系统导论(Operating Systems: Three Easy Pieces)作者所开源的操作系统相关课程项目 的 KV 部分,包含个人的代码实现和设计思路。 思路 题目要求实现一个最简单的数据库,以支持数据的持久化。 每个操作由格式为 o…

本文将介绍操作系统导论(Operating Systems: Three Easy Pieces)作者所开源的操作系统相关课程项目 的 KV 部分,包含个人的代码实现和设计思路。

思路

题目要求实现一个最简单的数据库,以支持数据的持久化。

每个操作由格式为 op,[arg1],[arg2] 的命令给出,那么首先要解决的问题就是参数的分离,再根据操作符 op 来对不同的操作进行特殊处理。字符串划分这里采用的是 strsep() 函数:该函数接收两个参数 char** stringpconst char* delimstringp 是指向待分割字符串 string 的指针,delim 则是指定的分隔符,该函数的操作是查找 string 中第一个 delim 的位置 it,并将 stringp 指向 stringit + 1 的位置,同时返回string 开头到 it 所有字符所构成的子串(加上 '\0' 终结符)。

插入操作没什么好说的,直接使用 fprintf() 写入文件即可。对于查找和删除,则需要将数据从文件(数据库)中读取到内存,存储在特定的数据结构中,例如哈希表、红黑树等,但为了代码实现的简单,我使用的是最简单的链表。对于查找,先将所有数据读取到一个链表中,然后按顺序逐个进行查找;对于删除,将所有数据读取到一个链表中,然后逐个遍历链表,如果当前结点的键(key)与参数不同,则写入文件中,否则,不写入(相当于删除)。最后,为了防止内存的泄露,需要在每次结束查找和删除操作之后,将存储数据内容的链表结点的内存空间释放。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define DATA_BASE "./database.txt"typedef struct LineNode {char* line_buf;struct LineNode* next;
} line_node;// 从文件fp中读取数据
line_node* read_from_file(FILE* fp) {line_node* dummy = (line_node*)malloc(sizeof(line_node)); // 哨兵结点line_node* p = dummy;size_t sz = 0;while (1) {p->next = (line_node*)malloc(sizeof(line_node));p = p->next;if (getline(&(p->line_buf), &sz, fp) == -1) {p->next = NULL;break;}}return dummy->next;
}// 释放链表内存空间
void free_list_mem(line_node* data) {while (data != NULL) {line_node* temp = data;data = data->next;free(temp);}
}int main(int argc, char* argv[]) {for (int i = 1; i < argc; ++i) {char* op = strsep(&argv[i], ","); // 操作符if (!strcmp(op, "p")) {char* key = strsep(&argv[i], ",");char* value = strsep(&argv[i], ",");if (argv[i] != NULL) {printf("bad command\n");continue;}FILE* fp = fopen(DATA_BASE, "a");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}fprintf(fp, "%s,%s\n", key, value);fclose(fp);}else if (!strcmp(op, "g")) {char* key = strsep(&argv[i], ",");if (argv[i] != NULL) {printf("bad command\n");continue;}FILE* fp = fopen(DATA_BASE, "r");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}line_node* data = read_from_file(fp);line_node* p = data;int flag = 0;while (p != NULL) {char* entry = strdup(p->line_buf); // 条目备份(line_buf会被strsep()修改)char* token = strsep(&(p->line_buf), ",");if (!strcmp(token, key)) { // 找到keyflag = 1;printf("%s", entry);break;}p = p->next;}if (!flag) {printf("%s not found\n", key);}free_list_mem(data);fclose(fp);}else if (!strcmp(op, "d")) {char* key = strsep(&argv[i], ",");if (argv[i] != NULL) {printf("bad command\n");continue;}FILE* fp = fopen(DATA_BASE, "r");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}line_node* data = read_from_file(fp);fclose(fp);// 清空文件fp = fopen(DATA_BASE, "w");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}fclose(fp);fp = fopen(DATA_BASE, "a");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}line_node* p = data;while (p != NULL) {char* entry = strdup(p->line_buf); // 条目备份char* token = strsep(&(p->line_buf), ",");if (strcmp(token, key)) { // 当前条目键值为key,不写入(相当于删除)fprintf(fp, "%s", entry);}p = p->next;}free_list_mem(data);fclose(fp);}else if (!strcmp(op, "c")) {if (argv[i] != NULL) {printf("bad command\n");continue;}FILE* fp = fopen(DATA_BASE, "w");if (fp == NULL) {fprintf(stderr, "cannot open file %s\n", DATA_BASE);exit(1);}fclose(fp);}else if (!strcmp(op, "a")) {if (argv[i] != NULL) {printf("bad command\n");continue;}FILE* fp = fopen(DATA_BASE, "r");line_node* data = read_from_file(fp);line_node* p = data;while (p != NULL) {printf("%s", p->line_buf);p = p->next;}free_list_mem(data);fclose(fp);}else {printf("bad command\n");continue;}}return 0;
}
http://www.yayakq.cn/news/796295/

相关文章:

  • 定制网站制作技术城乡建设厅建筑特种作业证书查询
  • 鄂尔多斯做网站莆田市秀屿区建设局网站
  • ps里新建网站尺寸怎么做wordpress 获取页面
  • 重庆建设造价工程信息网站天津网站建设吐鲁番地区
  • wordpress 组织架构优化网哪个牌子好
  • 阿里云网站 模板建设wordpress 首页描述
  • 网络规划设计方案模板深圳seo网络优化
  • 网站开发前端跟后端的区别长沙招聘网站
  • crm客户系统网站聚合优化
  • 手机网站建立教程网站建设公司重庆
  • 长兴县建设局网站广州海珠区二手房房价
  • 做网站的基本功能学动漫设计需要什么条件
  • 企业网站建设费现金流科目网站做点击收费
  • 简洁大方网站建设卡盟自助网站建设
  • 上海有什么大公司徐州关键词优化排名
  • 栾川网站建设网页设计模板html代码dw
  • 老域名怎么做新网站陕西省建设执业注册中心网站
  • 网站的相关链接怎么做带有客户案例的网站
  • 电子商务网站需求分析网站开发的出路
  • 济南协会网站设计团队淘宝网页版电脑版入口
  • 公司网站备案号凡客优品家居官方网站
  • 什么网站可以做注册任务京东商城官网自营店
  • 广州设计网站全文wordpress主题
  • wordpress 网站访问认证页面做网站推广优化
  • 怎么样创建网站北京国互网网站建设公司
  • 建一个下载网站要什么cms系统北京建筑公司有哪些
  • 网站开发技术项目说明书wordpress 图片特效插件
  • jsp 网站开发环境阿里云虚拟主机建站教程
  • 湖州网站seo优化没有网站可以做淘宝客吗
  • 网站服务器买了后怎么做如何建立一个永久网站