C的一道笔试题

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
/*
将名值对name=value写入文本文件file
如果文件中该名值对已经存在,则更新已存在的名值对
参数:
	file	-- 文本格式的配置文件名
	name	-- 名值对中的名字
	value	-- 名值对中的值
返回:
	0		-- 成功
	-1		-- 失败
*/
int write_config(const char *file,const char *name,const char *value)
{
	int flag = 0;
	FILE *fp,*fp_tmp;
	fp = fopen(file,"r");
	if(NULL == fp){
		printf("fopen error,%s\n",strerror(errno));
		return -1;
	}

	char file_tmp[256] = {0};
	strcat(file_tmp,file);
	strcat(file_tmp,".tmp");
	fp_tmp = fopen(file_tmp,"w+");
	if(NULL == fp_tmp){
		printf("fopen error,%s\n",strerror(errno));
		return -1;
	}

	char buf[256];
	while(!feof(fp)){
		buf[0] = '\0';
		fgets(buf,256,fp);
		if(strncmp(buf,name,strlen(name)) == 0){
			flag = 1;
			fprintf(fp_tmp,"%s = %s\n",name,value);
		}
		else{
			fprintf(fp_tmp,buf);
		}
		
	}
	if(flag == 0){
		fprintf(fp_tmp,"%s = %s\n",name,value);
	}

	fclose(fp);
	fclose(fp_tmp);
	//unlink(file);
	if(remove(file) != 0){
		printf("remove error,%s\n",strerror(errno));
	}
	if(rename(file_tmp,file) != 0){
		printf("rename error,%s\n",strerror(errno));
	}
	return 0;
}

/* 将value_arr的值清除两边空格 */
char * del_space(char *value_arr){
	//printf("value_arr = %s\n",value_arr);
	char *value_arr_head,*value_arr_tail;
	value_arr_head = value_arr;
	while(*value_arr_head == ' '){
		value_arr_head++;
	}
	value_arr = value_arr_head;		//到此,value_arr去掉了前面的空格
	//printf("value_arr = %s\n",value_arr);

	//去掉value_arr的后面空格
	value_arr_head = value_arr;
	while(*value_arr_head != '\0'){				//  eg:  User = Jack  son 
		value_arr_head++;
	}
	value_arr_tail = value_arr_head - 1;
	while(*value_arr_tail == ' '){
		*value_arr_tail = '\0';
		value_arr_tail--;
	}
	//printf("value_arr = %s\n",value_arr);
	return value_arr;
}

/*
从文本文件file中读取名为name的名值对的值,将值存入参数value指向目标缓冲区。
参数:
	file	-- 文本格式的配置文件名
	name	-- 名值对中的名字
	value	-- 用于存放值的目标缓冲区
	size	-- 目标缓冲区大小
返回:
	>=0		-- 成功读取到的值的长度,以字节为单位。
	-1		-- 失败
*/
int read_config(const char *file,const char *name,char *value,int size)
{
	char file_buf[256],*p_file_buf;
	FILE *fp;
	fp = fopen(file,"r+");
	if(NULL == fp){
		printf("fopen error,%s\n",strerror(errno));
		return -1;
	}

	while(!feof(fp)){
		char *del_file_buf;
		fgets(file_buf,256,fp);
		del_file_buf = del_space(file_buf);
		if(strncmp(del_file_buf,name,strlen(name)) == 0){
			p_file_buf = del_file_buf;
			while(*p_file_buf != '='){
				p_file_buf++;
			}
			p_file_buf++;
			/* 定义一个数组,并将value值赋给它 */
			char value_arr[256];
			int i = 0;
			while (*p_file_buf != '\0'){
				value_arr[i] = *p_file_buf;
				i++;
				p_file_buf++;
			}
			value_arr[i] = '\0';

			// 将value_arr的值清除空格
			value = del_space(value_arr);
			printf("value = %s\n",value);
			fclose(fp);
			return 0;
		}
	}
	return 0;
}

//下面主函数为调用示例,请不要进行任何改动。
int main()
{
	char buf[256];
/*
假定有a.ini,内容如下:
Server=192.168.1.2

  User = Jackson
  
Password=abc
*/


	write_config("./a.ini","Database","MyDB");
/*
执行完上一行后,a.ini的内容应该为:
Server=192.168.1.2

  User = Jackson
  
Password=abc
Database=MyDB
*/


	write_config("./a.ini","Password","xyz");
/*
执行完上一行后,a.ini的内容应该为:
Server=192.168.1.2

  User = Jackson
  
Password=xyz
Database=MyDB
*/


	read_config("./a.ini","Server",buf,sizeof(buf));
/*
执行完上一行后,buf里面应该存放字符串"192.168.1.2"	
*/

	read_config("./a.ini","User",buf,sizeof(buf));
/*
执行完上一行后,buf里面应该存放字符串"Jackson"
*/
	return 0;
}

/* 该题思路是:文本里是以二进制存放数据的,容易犯的错误就是用指针直接在中间更新
* 写的时候就是一段一段的读取原文件,相同直接复制,否则更新或者添加,
* 读则要先去掉两边的空格,用指针节省空间
*/


你可能感兴趣的:(c,笔试)