//FILE *fopen(char *filename,char *type);
//int fclose(FILE *stream);
//int fcloseall(void);
//int fget(FILE *stream);
//int fput(int ch , FILE *stream); stream = stdout --> 打到屏幕
//putc()与fputc()等价,getc()与fgetc()等价
//putchar(c)相当于fputc(c,stdout);
//getchar()相当于fgetc(stdin);
//feof()函数来测试是否到了文件尾
//ferror()函数来测试是否出错
//gets()-->遇到换行符和文件结束标示,则结束
//char * fputs(char * str, len , FILE *stream);
//fprintf(FILE * stream,"格式",数据)向流指针指向的文件输出-->文件相当于屏幕
//fscanf()从文件中读到指定的数组
//getch()从控制台读取一个字符,并且不回显在屏幕上
//int fflush(FILE *stream);
//int flushall();
//设置文件缓冲区函数
//void setbuf(FILE *stream,char *buf);
//void setbuf(FILE *stream,char *buf,int type,unsigned size);
//type:
// ---> _IOFBF 文件全部缓冲区,即缓冲区装满后,才能堆文件读写
// ---> _IOLBF 文件行缓冲,即缓冲区接收到一个换行符时,才能对文件读写
// ---> _IONBF 文件不缓冲
//移动文件指针的函数:
// long ftell(FILE *stream); -->得到文件指针离开文件开头的偏移量,返回-1时表示出错
// int rewind(FILE *stream); -->用于文件指针移到文件开头,成功返回0,不成功非0
// fseek(FILE *stream,long offset,int origin); -->用于把文件指针以origin为起点移动offset个字节
// origin:
// SEEK_SET 0 文件开头
// SEEK_CUR 1 文件指针当前位置
// SEEK_END 2 文件尾
//int fread(void *ptr,int nitems,FILE *stream);
//int fwrite(void *ptr,int size,int nitems,FILE *stream);
//非标准文件的读写 <io.h>
//int open(char *filename , int access);
//access:
// O_RDONLY -->只读
// O_WRONLY -->只写
// O_RDWR -->读写
// O_BINARY -->打开一个二进制文件
// O_TEXT -->打开一个文字文件
// O_APPEND -->文件指针指向末尾
// O_CREAT -->文件不存在时创建文件,属性按基本模式属性
// O_TRUNC -->若文件存在,将其长度缩为0,属性不变
//
//int close(int handle);
//读写函数
//int read(int handle,void *buf,int count);
// -->从handle相连的文件中,读取count个字节放到buf所指的缓冲区中
// -->返回值:-1表示出错,返回0表示文件结束
//int write(int handle,void *buf,int count);
// -->把count个字节从buf指向的缓冲区写入与handle相连的文件中
// -->返回实际写入的字节数
//int lseek(int handle,long offset,int fromwhere);
//long tell(int handle);
#include <iostream>
#include <string.h>
using namespace std;
#define MAXSIZE 1024
#define FILENAME "F:/config/config1.txt"
int WriteConfig(const char *filename,char *key_buf,char *valude_buf)
{
int ret = 0;
int len = 0;
int flag = 0;
char filebuf[MAXSIZE * 8];
char linebuf[MAXSIZE];
char *ptmp = NULL;
FILE *fp;
if (filename == NULL || key_buf == NULL || valude_buf == NULL)
{
ret = -1;
printf("filename == NULL || key_buf == NULL || valude_buf == NULL:");
return ret;
}
fp = fopen(filename,"w+t"); //没有该问价则创建一个
if (fp == NULL)
{
ret = -2;
printf("fopen(filename) error:");
return ret;
}
//判断文件的是否满了
fseek(fp,0L,SEEK_END);
len = ftell(fp);
if (len >= MAXSIZE)
{
ret = -3;
printf("file will full error:len >= MAXSIZ:");
return ret;
}
rewind(fp); //回到文件头部
//将每行数据取出来,放到linefile-->找key
while (!feof(fp))
{
memset(linebuf,0,sizeof(linebuf));
fgets(linebuf,MAXSIZE,fp);
//判断改行有没有key
ptmp = strstr(linebuf, key_buf);
if (ptmp == NULL) //如果没有-->把改行内容暂存在filebuf
{
strcat(filebuf,linebuf);
continue;
}
else //如果存在-->重写linebuf,然后再缓存到filebuf
{
sprintf(linebuf,"%s=%s\n",key_buf,valude_buf);
strcat(filebuf,linebuf);
flag = 1;
continue;
}
}
if (flag == 0) //不存在key-->将key和valude写到文件末尾
{
char tmp[MAXSIZE];
sprintf(tmp,"%s=%s\n",key_buf,valude_buf);
ret = fputs(tmp,fp);
if (ret == EOF)
{
ret = -5;
printf("ret = fputs(tmp,fp):");
return ret;
}
}
else //如果存在-->将filebuf写到文件中
{
fseek(fp,SEEK_END,SEEK_SET);
fputs(filebuf, fp);
}
fclose(fp);
return ret;
}
void trimspace(char *srcstr, char *outstr)
{
//printf("%s\n",srcstr);
int left = 0;
int right = strlen(srcstr) - 2; //有 ‘\n’
while (isspace(srcstr[left]))
{
left++;
}
while (isspace(srcstr[right]))
{
right--;
}
memset(outstr,0,sizeof(outstr));
strncpy(outstr,srcstr+left,right-left+1);
outstr[right - left+1] = '\0';
return;
}
void ToWriteConfig() //写配置文件
{
int ret = 0;
char key_buf[MAXSIZE];
char valude_buf[MAXSIZE];
printf("请输入key: ");
scanf("%s",&key_buf);
printf("\n请输入valude: ");
scanf("%s", &valude_buf);
ret = WriteConfig(FILENAME,key_buf,valude_buf);
if (ret != 0)
{
printf("WriteConfig() is error:%d",ret);
}
return;
}
int ReadConfig(const char *filename , char *key_buf , char *valude_buf,int *valude_len)
{
int ret = 0;
char linebuf[MAXSIZE];
char *ptmp = NULL;
FILE *fp;
if (filename == NULL || key_buf == NULL || valude_buf == NULL || valude_len == NULL)
{
ret = -1;
printf("ilename == NULL || key_buf == NULL || valude_buf == NULL || valude_len == NULL");
return ret;
}
fp = fopen(filename , "r");
if (fp == NULL)
{
ret = -2;
printf("fopen() error");
return ret;
}
while (!feof(fp))
{
memset(linebuf,0,sizeof(linebuf));
fgets(linebuf,MAXSIZE,fp);
//printf("%s\n", linebuf);
//寻找等号
ptmp = strchr(linebuf,'=');
if (ptmp == NULL)
{
continue;
}
//寻找key
ptmp = strstr(linebuf,key_buf);
if (ptmp == NULL)
{
continue;
}
ptmp = ptmp + strlen(key_buf);
//寻找 = 号
ptmp = strchr(ptmp,'=');
ptmp += 1;
//去掉空格
trimspace(ptmp,valude_buf);
*valude_len = strlen(valude_buf);
}
fclose(fp);
return ret;
}
void ToReadConfig() //读配置文件
{
int ret = 0;
int valude_len = 0;
char key_buf[MAXSIZE];
char valude_buf[MAXSIZE];
printf("请你输入key:");
scanf("%s",&key_buf);
ret = ReadConfig(FILENAME,key_buf,valude_buf,&valude_len);
if (ret != 0)
{
printf(" ReadConfig() error:%d\n",ret);
}
printf("%s ",valude_buf);
printf("%d\n", valude_len);
return;
}
void menu()
{
printf("==================================\n");
printf("=== 1.写文件 ===\n");
printf("=== 2.读文件 ===\n");
printf("=== 0.退出 ===\n");
printf("==================================\n");
}
int main()
{
int choice;
while (1)
{
menu();
scanf("%d",&choice);
switch (choice)
{
case 1: //写配置文件
ToWriteConfig();
break;
case 2: //读配置文件
ToReadConfig();
break;
case 0:
exit(0);
default:
break;
}
}
return 0;
}