C语言 配置文件读写

//配置文件读写项目

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

int writefile(const char *path/*in*/, char *pkey/*in*/, char *pvalue/*in*/){
    int ERRO_MSG = 0;
    if (path==NULL)
    {
        ERRO_MSG = 1;
        printf("path==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    if (pkey == NULL)
    {
        ERRO_MSG = 2;
        printf("pkey==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    if (pvalue == NULL)
    {
        ERRO_MSG = 3;
        printf("pvalue==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }

    //定义文件读指针
    FILE *fpwr = fopen(path,"r+");
    //判断文件是否打开成功
    if (fpwr==NULL)
    {
        ERRO_MSG = 4;
        printf("文件打开失败!erro msg:%d;文件路径是%s\n", ERRO_MSG,path);
        return ERRO_MSG;
    }
    //判断原来配置文件里是否有该节点,有该配置节点执行修改操作,没有执行新增操作
    //准备字符指针数组,存储所有的键值对
    //定义下标
    int index = 0;
    char **bufarr = (char **)malloc(sizeof(char *)*(index + 1));
    //存储所有的配置文件(这里读取键值对,用fgets()函数比较合适,因为一行正好一个键值对)
    while (!feof(fpwr)){//feof()如果文件结束,则返回非0值,否则返回0
        //定义文件缓存数组
        char buf[100] = { 0 };
        //读取文件
        fgets(buf, 100, fpwr);
        //分配每个键值对内存存储空间
        char *ptemp = (char *)malloc(sizeof(char)*((int)strlen(buf)+1));
        //拷贝字符串(buf定义在栈里,出了该函数会自动释放)
        strcpy(ptemp, buf);//strcpy()把从src地址开始且含有‘\0‘结束符的字符串复制到以dest开始的地址空间。
        //把字符串挂到指针数组上
        bufarr[index++] = ptemp;
        //为指针数组再次分配内存空间
        bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + 1));
    }
    //为指针数组最后一个元素赋值NULL
    bufarr[index] = NULL;
    //开始查找对应键值对
    int a = 0;
    char *strindex = NULL;
    while (bufarr[a]!=NULL){
        char *ptsource = bufarr[a];
        while (*ptsource != ‘\0‘){
            int b = 0, flag = 0;
            //strchr函数原型:extern char *strchr(const char *s, char c); 返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果s中不存在c则返回NULL。
            char *ptempc = strchr(ptsource, pkey[b]);
            ptsource = strindex=ptempc;
            if (ptempc == NULL)
            {
                //没有找到该字符串
                flag = 1;
                break;
            }
            //开始匹配字符串
            while (pkey[b] != ‘\0‘){
                //一个一个字符进行比较
                if (*(ptempc++) != pkey[b++])
                {
                    flag = 1;
                    strindex = NULL;
                    break;
                }
            }
            break;
        }
        if (strindex!=NULL)
        {
            //执行修改操作
            //释放原来的字符串
            if (bufarr[a]!=NULL)
            {
                free(bufarr[a]);
                char newbuf[100] = { 0 };
                sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
                //开辟新的字符串内存空间
                char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf)+1));
                //复制字符串
                strcpy(pnewstr, newbuf);
                bufarr[a] = pnewstr;
            }
            break;
        }
        a++;
    }
    //没有找到对应的键
    if (strindex==NULL)
    {
        //执行新增操作
        bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + 2));
        char newbuf[100] = { 0 };
        sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
        //开辟新的字符串内存空间
        char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf) + 1));
        //拷贝字符串
        strcpy(pnewstr, newbuf);
        bufarr[index] = pnewstr;
        bufarr[index + 1] = NULL;
    }
    int index2 = 0;
    //关闭文件指针
    if (fpwr != NULL)
    {
        fclose(fpwr);
    }
    //为什么这里我会重新打开文件呢
    //因为写文件的时候是把缓存区的内容写入到文本里,此刻如果不是释放指针fpwr,缓存区里就会有刚刚读的内容
    //所以必须释放指针才可以清空缓存
    //打开新文件指针
    FILE *pfw = fopen(path,"w");
    //fflush(fpwr);
    //开始写文件
    while (bufarr[index2] != NULL){
        //将文件写入到缓存
        fputs(bufarr[index2], pfw);
        //释放字符指针数组元素内存
        free(bufarr[index2]);
        index2++;
    }
    //释放字符指针数组内存
    free(bufarr);
    //关闭文件指针
    if (pfw != NULL)
    {
        fclose(pfw);
    }
    return ERRO_MSG;
}

int readfile(const char *path/*in*/){
    int ERRO_MSG = 0;
    if (path==NULL)
    {
        ERRO_MSG = 1;
        printf("path!=NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    //定义文件指针
    FILE *fpr = NULL;
    //打开文件
    fpr = fopen(path,"r");
    if (fpr==NULL)
    {
        ERRO_MSG = 2;
        printf("文件打开失败 erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    while (!feof(fpr)){
        char buf[100] = { 0 };
        fgets(buf, 100, fpr);
        printf("%s",buf);
    }
    //关闭文件指针
    if (fpr!=NULL)
    {
        fclose(fpr);
    }
    return ERRO_MSG;
}

void testf1(const char *path/*in*/){
    char buf1[100] = { 0 };
    char buf2[100] = { 0 };
    printf("请输入键:\n");
    scanf("%s", buf1);
    printf("请输入值:\n");
    scanf("%s", buf2);
    writefile(path, buf1, buf2);
}

void main(){
    char *path = "E:/Test/CwordTest/b1.txt";
    while (1){
        int num = 0;
        printf("请输入对应的操作:\n");
        printf("添加新的键值对请按1:\n");
        printf("查询所有键值对请按2:\n");
        printf("修改键值对请按3:\n");
        scanf("%d",&num);
        switch (num)
        {
        case 1:
            testf1(path);
            break;
        case 2:
            readfile(path);
            break;
        case 3:
            testf1(path);
            break;
        default:
            break;
        }
    }
    system("pause");
}

时间: 2024-10-10 06:58:47

C语言 配置文件读写的相关文章

ASP.NET5最佳实践:技术选择+依赖注入+配置文件读写

1.技术选择 页面: html静态页面很好,但模板(代码块)重用怎么办? 再有与后台交互,比如绑定数据又如何办? 模板不能重用,无解.后台交互,无怪乎可以使用js代码.特别现在流行SPA应用,html+angularjs类的框架…… cshtml可以使用Layout页(类似webfroms master模板页),也可以使用ViewsComponets(类似于webfroms web控件) 它使用Razor视图引擎解析,页面甚至可以使用c#语言.和后台交互式很Easy的. 如果说cshtml结构代

配置文件读写操作类

1 package com.epichust.mestar.client.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Properties; 8 9 /** 10 * 读取配置文件工具类 11 * 12 * 13 */ 14 public cl

LIB 配置文件读写器

由于读写配置文件的次数比较频繁,而且拥有众多的类库,到最后,直接被各种各样的类库烦死. 顺手封一个简单,实用的.主要功能: 读写AppSetting 读取连接字符串 读取自定义配置节 using System; using System.Configuration; using System.Web.Configuration; namespace HPWorkUtility { /// <summary> /// 配置文件读写器 /// </summary> public cla

Go语言配置文件解析器,类似于Windows下的INI文件.

config Package config is a Configuration file parser for INI format 包 config 是一个简洁方的,支持注释的Go语言配置文件解析器,类似于Windows下的INI文件. 配置文件形式为[section] 的段构成, 内部使用 name=value键值对 如果为指定段节点,则默认放入名为[default]的段当中. "#"为注释的开头,可以放置于任意的单独一行中. 安装 go get github.com/lxmgo

3,C语言文件读写

这两天看到一个关于文件读写的题目,索性就把相关内容总结下. C语言文件读写,无非是几个读写函数的应用,fopen(),fread(),fwrite()等,下面简单介绍下. 一.fopen() 函数原型:FILE *fopen(const char *path, const char *mode); 参数说明:path,所打开的文件名(包含文件路径,缺省值为当前工程目录):mode:流形态,后文详述. 返回值:文件指针.打开失败,返回NULL;打开成功,返回指向该流的文件指针. mode详解:mo

C语言文件读写命令fprintf和fscanf

以向文件中读取和写入二维数组为例. 以下是fprintf的使用:向文件中写入10*10的二维数组,数组元素为1~100之间的随机数. #include <stdlib.h> #include<iostream> using namespace std; int main() { int array[13][13],i,j; FILE *fp = fopen("result.txt", "w"); if(!fp) { printf("

C语言文件读写操作总结

C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char

C语言程序读写文件(文件内存一个十进制数,每读一次数值加一)

1.问题:C语言程序实现读写一个txt文件,txt文件中存储一个十进制数.每读一次该数值加一. 2.实现:新建一个文件夹,在该文件夹中建一个outputFileName.txt文件.内容是:1,再在该文件夹中新建一个t.c文件.内容是下面的代码. 3.代码: #include <stdio.h>#include <stdlib.h>char * getFileNum();void setFileNum(char * fileNume);int main() { char * num

[C/C++语言基础]读写文件

1.打开.关闭文件: FILE* fp = fopen(string.c_str(), FLAG); string.c_str():需用C语言字符串形式: FLAG说明: r: 只读方式打开: w: 只写方式打开: a:追加方式打开: r+: 以读/写方式打开:(无文件:出错) w+: 以读/写方式打开:(无文件:新建) int fclose(FILE* fp); 成功:返回0: 失败:返回EOF: 2.读写文件: char *fgets(char *s, int n, FILE *stream