C高级编程 第七天(文件读写练习)

2024-08-26 04:44

本文主要是介绍C高级编程 第七天(文件读写练习),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

有一个文件如下,包括key:value

 ①根据字符串判断是否是有效行

②计算文件有效行数

③解析文件

④根据key获取对应的value

⑤释放内存


有一个文件如下,包括key:value

 ①根据字符串判断是否是有效行

该字符串只有换行符或者不包含冒号就不算做一行;该字符串包含":"则为有效行数

int isInvalidLine(char* arr)
{if (arr[0] == '\n' || strchr(arr, ':') == NULL)//若此行只有换行符 或者 不包含冒号 就不算做一行{return 0;}return 1;
}

②计算文件有效行数

按行读取文件,若该行是有效行,则行数加一

int getLines(const char* Path)
{FILE* file = fopen(Path, "r");char arr[64] = { 0 };int line = 0;//记录行数if (file != NULL){while (fgets(arr, 1024, file) != NULL)	//按行读取{if (1 == isInvalidLine(arr))	//如果此行有效,则行数加一{line++;}}}return line;
}

③解析文件

将文件中的内容存放到结构体中

int parseFile(const char* filepath, int lines, struct ConfigInfo** configInfo)
{struct ConfigInfo* config = (struct ConfigInfo*)malloc(sizeof(struct ConfigInfo) * lines);FILE* file = fopen(filepath, "r");if (NULL != file){int index = 0;char buff[1024] = { 0 };//将每行读取的数据放入其中while (NULL != fgets(buff, 64, file)){if (1== isInvalidLine(buff)){//清空结构体memset(configInfo[index]->key, 0, 64);memset(configInfo[index]->value, 0, 64);char* arr = strchr(buff, ':');strncpy(configInfo[index]->key, buff, arr - buff);strncpy(configInfo[index]->value, arr+1, strlen(arr+1)-1);//-1是为了不要文件中的换行符printf("key是%s\n", configInfo[index]->key);printf("value是%s\n", configInfo[index]->value);index++;}}memset(buff, 0, 1024);}*configInfo = config;
}

④根据key获取对应的value

char* getValueByKey(char* key, ConfigInfo* configInfo, int lines)
{for (int i = 0; i < sizeof(configInfo) / sizeof(struct ConfigInfo); i++){if (key == configInfo[i].key){return configInfo[i].value;}}return nullptr;
}

⑤释放内存

void freeSpace(ConfigInfo* configInfo)
{if (NULL == configInfo){return;}free(configInfo);configInfo = nullptr;
}

这篇关于C高级编程 第七天(文件读写练习)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107581

相关文章

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式