最近工作中需要实现对文件的读取,删除,写入操作,就参考各路大佬的博文,自己使用c语言简单的实现了对文件的增删改查操作,主要实现如下
kv.c文件主要实现对文件的读,写,删除操作接口的实现,
一.
*函数名 : RemoveKeyValue
*函数功能描述 :如果指定文件存在key就删除key及value
*函数入参: char *fileName 文件名,char *key 键名
二.
/**
*函数名 : WriteKeyValue
*函数功能描述 :如果指定文件存在key就修改其value,如果不存在就在文件尾部追加key = value
*函数入参: char *fileName 文件名,char *key 键名,char *value 值
**/
三.
/**
*函数名 : ReadValue
*函数功能描述 :查找指定文件key对于的value 存在返回其value,不存在返回NULL
*函数入参: char *fileName 文件名,char *key 键名
**/
具体代码如下:
#include "kv.h"
/**
*函数名 : RemoveKeyValue
*函数功能描述 :如果指定文件存在key就删除key及value
*函数入参: char *fileName 文件名,char *key 键名
**/
void RemoveKeyValue(char *fileName,char *key)
{
char buf[ABUP_JSON_VALUE_SIZE] = "";
int isExist = 0;
int i = 0;
FILE *fp,*temp;
fp = fopen(fileName,"r");
temp = fopen("temp.txt","w");
if(fp == NULL)
{
printf("----------该文件不存在-----\n");
goto finish;
}
fgets(buf,ABUP_JSON_VALUE_SIZE,fp);
do{
while(buf[i] == ' ')
{
i++;
}
if(strncmp(&buf[i],key,strlen(key))==0)
{
continue;
}
else
{
fputs(buf,temp);
}
}while(fgets(buf,ABUP_JSON_VALUE_SIZE,fp));
fclose(fp);
fclose(temp);
fp = fopen(fileName,"w");
temp = fopen("temp.txt","r");
while(1)
{
fgets(buf,sizeof(buf),temp);
if(feof(temp))
{
printf("删除成功\n");
break;
}
fputs(buf,fp);
}
fclose(fp);
fclose(temp);
remove("temp.txt");
finish:
return ;
}
/**
*函数名 : WriteKeyValue
*函数功能描述 :如果指定文件存在key就修改其value,如果不存在就在文件尾部追加key = value
*函数入参: char *fileName 文件名,char *key 键名,char *value 值
**/
void WriteKeyValue(char *fileName,char *key,char *value)
{
char buf[ABUP_JSON_VALUE_SIZE] = "";
int i = 0;
int isExist = 0;
FILE *fp,*temp;
fp = fopen(fileName,"r");
if(fp == NULL)
{
fp = fopen(fileName,"w");
fprintf(fp,"%s = %s\n",key,value);
fclose(fp);
printf("-------写入成功----------\n");
}
else
{
temp = fopen("temp.txt","w");
fgets(buf,ABUP_JSON_VALUE_SIZE,fp);
do{
while(buf[i] == ' ')
{
i++;
}
if(strncmp(&buf[i],key,strlen(key))==0)
{
fprintf(temp,"%s = %s\n",key,value);
isExist++;
}
else
{
fputs(buf,temp);
}
}while(fgets(buf,ABUP_JSON_VALUE_SIZE,fp));
if(isExist == 0)
{
fprintf(temp,"%s = %s\n",key,value);
}
fclose(fp);
fclose(temp);
fp = fopen(fileName,"w");
temp = fopen("temp.txt","r");
while(1)
{
fgets(buf,sizeof(buf),temp);
if(feof(temp))
{
printf("-------写入成功----------\n");
break;
}
fputs(buf,fp);
}
fclose(fp);
fclose(temp);
remove("temp.txt");
}
}
/**
*函数名 : ReadValue
*函数功能描述 :查找指定文件key对于的value 存在返回其value,不存在返回NULL
*函数入参: char *fileName 文件名,char *key 键名
**/
char* ReadValue(char *fileName,char *key)
{
char buf[ABUP_JSON_VALUE_SIZE] = "";
int i = 0;
char *value = NULL;// value
int valueLen = 0;//value长度
char *valueBuf = NULL;
int isExist = 0;
FILE *fp;
fp = fopen(fileName,"r");
if(fp == NULL)
{
goto finish;
}
fgets(buf,ABUP_JSON_VALUE_SIZE,fp);
do{
while(buf[i] == ' ')
{
i++;
}
if(strncmp(&buf[i],key,strlen(key))==0)
{
value = strstr(&buf[i],"=")+1;
valueLen = strlen(value);
valueBuf = (char*)malloc(sizeof(char)*(valueLen+1));
i = 0;
while(i
kv.h文件主要实现增删改查接口函数声明,具体代码如下:
#ifndef __KV_H__
#define __KV_H__
#ifdef __cplusplus
extern "C" {
#endif
#include
#include
#include
#define ABUP_JSON_VALUE_SIZE 1024
#define ABUP_JSON_KEY_SIZE 128
void WriteKeyValue(char *fileName,char *key,char *value);
char* ReadValue(char *fileName,char *key);
void RemoveKeyValue(char *fileName,char *key);
#ifdef __cplusplus
}
#endif
#endif // __KV_H__
demo.c文件中测试接口函数写好,main函数前面还实现了一个生成随机字符串的函数,根据自己的需要将代码注释打开进行测试。
demo.c:主要实现对kv.c各个函数接口的调用,代码如下:
#include "kv.h"
#include
#include
//产生长度为length-1长度的随机字符串
char* genRandomString(int length)
{
int flag, i;
char* string;
srand((unsigned) time(NULL ));
if ((string = (char*) malloc(length)) == NULL )
{
return NULL ;
}
for (i = 0; i < length - 1; i++)
{
flag = rand() % 3;
switch (flag)
{
case 0:
string[i] = 'A' + rand() % 26;
break;
case 1:
string[i] = 'a' + rand() % 26;
break;
case 2:
string[i] = '0' + rand() % 10;
break;
default:
string[i] = 'x';
break;
}
}
string[length - 1] = '\0';
return string;
}
int main(int argc, char const *argv[])
{
char fileName[50] = "test";//文件名
char fileName1[50] = "test1";//文件名
char key[ABUP_JSON_KEY_SIZE] = "10";//键
char *key1 = NULL;
char *value1 = NULL;
char value[ABUP_JSON_KEY_SIZE] = "hello";//值
char *temp = NULL;
int i=0;
/*
//获取文件中的key所对应的value;
key1 = genRandomString(3);
printf("----------key1 = %s ------\n", key1);
temp = ReadValue("test",key1);
if(temp == NULL)
{
printf("-----------文件不存在或者没有查到数据-------------\n");
}
else
{
printf("-----------已查到value值如下-------------\n");
puts(temp);
}
*/
/*
//向fileName中写入20个随机的key-value
for(i=0;i<20;i++)
{
key1 = genRandomString(3);
value1 = genRandomString(10);
WriteKeyValue(fileName,key1,value1);
printf("------i = %d-------\n",i);
sleep(1);
}
*/
//WriteKeyValue(fileName,key,value);
/*
//删除fileName1中的key-value
RemoveKeyValue(fileName1,key);
*/
return 0;
}
才学疏浅,如有错误,还望各路大佬指正,在下不甚感激...