C语言实现<读取>和<写入> *.ini文件。

本文之前由于技术不到位,写的比较挫,最近花了大半天时间写了一个高级点的版本。这里是我写的代码,已经上传到github了。跳转到github主要是使用了链表保存ini文件的内容,在程序运行最初会初始化链表,接下来的查询操作都只是查询内存,比较快,而且此时也不依赖文件了。最大的改变就是自己对编程的熟悉和了解,再也不会写挫逼代码咯。下面是源代码,个人感觉还不错。欢迎大家使用。#incl...
摘要由CSDN通过智能技术生成

本文之前由于技术不到位,写的比较挫,最近花了大半天时间写了一个高级点的版本。

这里是我写的代码,已经上传到github了。跳转到github

主要是使用了链表保存ini文件的内容,在程序运行最初会初始化链表,接下来的查询操作都只是查询内存,比较快,而且此时也不依赖文件了。最大的改变就是自己对编程的熟悉和了解,再也不会写挫逼代码咯。

下面是源代码,个人感觉还不错。欢迎大家使用。

#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#define  MAX_VALUE  64 /* 定义section,key,value字符串最大长度 */
// printf("File = %s\nLine = %d\nFunc=%s\nDate=%s\nTime=%s\n", __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__);
#define  PRINT_ERRMSG(STR) fprintf(stderr,"line:%d,msg:%s,eMsg:%s\n", __LINE__, STR, strerror(errno))

#define TRIM_LIFT  1 /* 去除左边空白字符 */
#define TRIM_RIGHT 2 /* 去除右边空白字符 */
#define TRIM_SPACE 3 /* 去除两边空白字符 */

typedef struct _option {
  char    key[MAX_VALUE];   /* 对应键 */
  char    value[MAX_VALUE]; /* 对应值 */
  struct  _option *next;    /* 链表连接标识 */
}Option;

typedef struct _data {
  char    section[MAX_VALUE]; /* 保存section值          */
  Option  *option;            /* option链表头           */
  struct  _data *next;        /* 链表连接标识           */
}Data;

typedef struct {
  char    comment;              /* 表示注释的符号    */
  char    separator;            /* 表示分隔符        */
  char    re_string[MAX_VALUE]; /* 返回值字符串的值  */
  int     re_int;               /* 返回int的值       */
  bool    re_bool;              /* 返回bool的值      */
  double  re_double ;           /* 返回double类型    */
  Data    *data;                /* 保存数据的头      */
}Config;

/**
* 判断字符串是否为空
* 为空返回true,不为空返回false
**/
bool str_empty(const char *string)
{
  return NULL == string || '\0' == *string;
}

/**
* 向链表添加section,key,value
* 如果添加时不存在section则新增一个
* 如果对应section的key不存在则新增一个
* 如果section已存在则不会重复创建
* 如果对应section的key已存在则只会覆盖key的值
**/
bool cnf_add_option(Config *cnf, const char *section, const char *key, const char *value)
{
  if (NULL == cnf || str_empty(section) || str_empty(key) || str_empty(value)) {
    return false; /* 参数不正确,返回false */
  }
  
  Data *p = cnf->data; /* 让变量p循环遍历data,找到对应section */
  while (NULL != p && 0 != strcmp(p->section, section)) {
    p = p->next;
  }
  
  if (NULL == p) { /* 说明没有找到section,需要加一个 */
    Data *ps = (Data*)malloc(sizeof(Data));
    if (NULL == ps) {
      exit(-1); /* 申请内存错误 */
    }
    strcpy(ps->section, section);
    ps->
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
在 C 语言中,可以使用标准库中的 `fopen()`、`fread()` 和 `fwrite()` 函数来进行文件读取写入操作。以下是一个简单的示例代码: ```c #include &lt;stdio.h> int main() { FILE *inputFile, *outputFile; char inputFileName[100], outputFileName[100]; char buffer[1024]; int bytesRead; // 打开输入文件 printf("Enter the name of the input file: "); scanf("%s", inputFileName); inputFile = fopen(inputFileName, "rb"); if (inputFile == NULL) { printf("Unable to open input file!"); return 1; } // 打开输出文件 printf("Enter the name of the output file: "); scanf("%s", outputFileName); outputFile = fopen(outputFileName, "wb"); if (outputFile == NULL) { printf("Unable to create output file!"); return 1; } // 读取输入文件写入输出文件 while ((bytesRead = fread(buffer, 1, sizeof(buffer), inputFile)) > 0) { fwrite(buffer, 1, bytesRead, outputFile); } // 关闭文件 fclose(inputFile); fclose(outputFile); printf("File copied successfully!"); return 0; } ``` 在这个示例代码中,程序要求用户输入要读取写入文件名。然后程序使用 `fopen()` 函数打开输入和输出文件,并检查文件是否打开成功。接着程序使用 `fread()` 函数读取输入文件内容,每次最多读取 `sizeof(buffer)` 个字节,`fread()` 函数返回实际读取的字节数。程序使用 `fwrite()` 函数将读取到的数据写入输出文件。最后程序使用 `fclose()` 函数关闭文件。 请注意,在使用 `fopen()` 函数打开文件时需要指定正确的读取写入模式。在上面的示例代码中,使用的是 "rb" 和 "wb" 模式,其中 "r" 表示只读模式,"w" 表示只写模式,"b" 表示二进制模式。如果要读取写入文本文件,应该使用 "r" 或 "w" 模式而不是 "rb" 或 "wb" 模式。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值