linux下C程序--读取配置文件--ini格式

合集下载

INI文件读写详解

INI文件读写详解
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString, // 同1(1)
INI文件的读写详解
INI文件读写 文章指数:0 CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
int i; //i指向数组chSectionNames的某个位置,从0开始,顺序后移
int j=0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量
int count=0; //统计节的个数
//CString name;
//char id[20];
//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym
//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:
::WritePrivateProfileString("Test","id","xym",".\\ex1.ini");
::GetPrivateProfileSectionNames(chSectionNames,2048,".\\ex1.ini");
for(i=0;i<2048;i++,j++)

C语言读取写入ini配置文件的方法实现

C语言读取写入ini配置文件的方法实现

C语⾔读取写⼊ini配置⽂件的⽅法实现⽬录⼀、了解什么是INI⽂件?⼆、INI⽂件的格式三、解析上述⽂件四、测试如下⼀、了解什么是INI⽂件?ini ⽂件是Initialization File的缩写,即初始化⽂件,这是⽤来配置应⽤软件以实现不同⽤户的要求。

⼆、INI⽂件的格式INI⽂件由节、键、值组成。

⼀个简单的的INI⽂件例⼦如下:[Setting]INIT_FLAG=0;VOLUME=1;LANGUAGE=1;如上例⼦,[Setting]就是节,=号左边的值是键,=号右边的是值。

三、解析上述⽂件/*ini.h*/#ifndef INI_H#define INI_H#include <stdio.h>#include <string.h>int GetIniKeyString(char *title,char *key,char *filename,char *buf);int PutIniKeyString(char *title,char *key,char *val,char *filename);#endif /*INI_H*//*ini.c*/#include <stdio.h>#include <string.h>/** 函数名: GetIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* filename* 要读取的⽂件路径* 返回值:找到需要查的值则返回正确结果 0* 否则返回-1*/int GetIniKeyString(char *title,char *key,char *filename,char *buf){FILE *fp;int flag = 0;char sTitle[64], *wTmp;char sLine[1024];sprintf(sTitle, "[%s]", title);if(NULL == (fp = fopen(filename, "r"))) {perror("fopen");return -1;}while (NULL != fgets(sLine, 1024, fp)) {// 这是注释⾏if (0 == strncmp("//", sLine, 2)) continue;if ('#' == sLine[0]) continue;wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准sLine[strlen(sLine) - 1] = '\0';fclose(fp);while(*(wTmp + 1) == ' '){wTmp++;}strcpy(buf,wTmp + 1);return 0;}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fclose(fp);return -1;}/** 函数名: PutIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* val* 更改后的值* filename* 要读取的⽂件路径* 返回值:成功返回 0* 否则返回 -1*/int PutIniKeyString(char *title,char *key,char *val,char *filename){FILE *fpr, *fpw;int flag = 0;char sLine[1024], sTitle[32], *wTmp;sprintf(sTitle, "[%s]", title);if (NULL == (fpr = fopen(filename, "r")))return -1;// 读取原⽂件sprintf(sLine, "%s.tmp", filename);if (NULL == (fpw = fopen(sLine, "w")))return -1;// 写⼊临时⽂件while (NULL != fgets(sLine, 1024, fpr)) {if (2 != flag) { // 如果找到要修改的那⼀⾏,则不会执⾏内部的操作wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准flag = 2;// 更改值,⽅便写⼊⽂件sprintf(wTmp + 1, " %s\n", val);}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fputs(sLine, fpw); // 写⼊临时⽂件}fclose(fpr);fclose(fpw);sprintf(sLine, "%s.tmp", filename);return rename(sLine, filename);// 将临时⽂件更新到原⽂件}上述两个函数是简单的解析函数,因为ini⽂件有很多种解析⽅式,根据不同的需求解析也不同所以要进⾏修改⽐如我的注释符号是 “ ;”,所以我需要修改并且根据实际功能需求也可以进⾏进⼀步的封装四、测试如下ini样本⽂件/*test.ini*/[city]beijing = hello-beijingshanghai = hello-shanghai#information[study]highschool = xxxxuniversity = yyyytest.c程序/*test.c*/#include "ini.h"#include <stdio.h>int main(int argc, char const *argv[]){char buff[100];int ret;ret = GetIniKeyString("city","beijing","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = PutIniKeyString("study","highschool","zzzz","./test.ini");printf("put ret:%d\n",ret);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);return 0;}结果如下:ret:0,hello-beijingret:0,xxxxput ret:0ret:0,zzzz相应的test.ini的study段highschool项变成了zzzz.这⾥还要注意,section使⽤中⽂字符可能会⽆法识别!到此这篇关于C语⾔读取写⼊ini配置⽂件的⽅法实现的⽂章就介绍到这了,更多相关C语⾔读取写⼊ini 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

Linux下C语言的文件读写

Linux下C语言的文件读写

Linux下C语言的文件(fputc,fgetc,fwrite,fread对文件读写操作)//==================================fputc 向文件写入字符#include <stdio.h>#include <stdlib.h>main(){FILE *fp;char ch;if((fp=fopen("test.txt","w"))==NULL){printf("不能打开文件\n");exit(0);}while ((ch=getchar())!='\n')fputc( ch, fp );fclose(fp);}-------------小提示:fp=fopen("test.txt","w") ,把"w"改为"a" 可以创建文件并且追加写入内容exit(0); 需要包含stdlib.h 头文件,才能使用//============================================================fgetc 读取字符#include <stdio.h>#include <stdlib.h>main( int argc, char *argv[] ){char ch;FILE *fp;int i;if((fp=fopen(argv[1],"r"))==NULL){printf("不能打开文件\n");exit(0);}while ((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}文件结尾,通过判断EOF//============================================================== fwrite 的使用使数组或结构体等类型可以进行一次性读写#include <stdio.h>#include <stdlib.h>main(){FILE *fp1;int i;struct student{char name[10];int age;float score[2];char addr[15];}stu;if((fp1=fopen("test.txt","wb"))==NULL){printf("不能打开文件");exit(0);}printf("请输入信息,姓名年龄分数1 分数2 地址:\n");for( i=0;i<2;i++){scanf("%s %d %f %f %s",,&stu.age,&stu.score[0],&stu.score[1], stu.addr);fwrite(&stu,sizeof(stu),1,fp1);}fclose(fp1);}//=============================================================== fread 的使用#include <stdio.h>#include <stdlib.h>main(){FILE *fp1;int i;struct student{char name[10];int age;float score[2];char addr[15];}stu;if((fp1=fopen("test.txt","rb"))==NULL){printf("不能打开文件");exit(0);}printf("读取文件的内容如下:\n");for (i=0;i<2;i++){fread(&stu,sizeof(stu),1,fp1);printf("%s %d %7.2f %7.2f %s\n",,stu.age,stu.score[0],stu.score[1],stu.addr);}fclose(fp1);}。

ini文件用法 -回复

ini文件用法 -回复

ini文件用法-回复Ini文件用法Ini文件是一种常见的配置文件格式,它被广泛应用于各种软件和操作系统中。

它的简洁和易于使用使得它成为配置文件的首选格式之一。

本文将逐步介绍ini文件的用法,并对其常见的操作进行详细解释。

I. 什么是Ini文件?Ini文件是一种普遍存在于Windows操作系统中的配置文件格式。

它由一系列节(section)和键值对(key-value pair)组成,用于存储和传递应用程序的配置信息。

Ini文件中的每个节都被方括号([])包围,而键值对则以键和值之间的等号(=)进行分隔。

II. Ini文件的基本语法一个基本的Ini文件由多个节组成,每个节都由方括号括起来。

每个节下面可以有多个键值对,键和值之间用等号连接。

例如:[section1]key1=value1key2=value2[section2]key3=value3key4=value4III. Ini文件的读写操作Ini文件常用于存储应用程序的配置信息。

在应用程序中,可以使用各种编程语言提供的函数或库来读取和写入Ini文件。

以下是一些常见的读写操作:1. 读取Ini文件读取Ini文件可以根据需要读取整个文件,或者只读取特定节或键的值。

大多数编程语言都提供了相应的函数或库来实现这些操作。

读取整个Ini 文件的示例代码如下:pythonimport configparserconfig = configparser.ConfigParser()config.read('config.ini')print(config.sections()) # 打印所有的节print(config['section1']['key1']) # 打印指定节的指定键的值上述示例代码使用了Python的configparser库来读取Ini文件。

configparser模块提供了ConfigParser类,它提供了简洁而强大的方法来读取和写入Ini文件。

归纳整理Linux下C语言常用的库函数----文件操作

归纳整理Linux下C语言常用的库函数----文件操作

归纳整理Linux下C语⾔常⽤的库函数----⽂件操作在没有IDE的时候,记住⼀些常⽤的库函数的函数名、参数、基本⽤法及注意事项是很有必要的。

参照Linux_C_HS.chm的⽬录,我⼤致将常⽤的函数分为⼀下⼏类:1. 内存及字符串控制及操作2. 字符串转换3. 字符测试4. ⽂件操作5. 时间⽇期6. 常⽤数学函数7. ⽂件内容操作8. ⽂件权限控制9. 进程操作10. 线程操作11. Socket操作12. 信号处理13. 数据结构及算法这次主要总结的是上⾯⿊⾊部分,关于⽂件操作的函数。

系统调⽤归类** 函数名⽤法备注**1. int open(const char *pathname, int flags); open and possibly create a file or device flags 必须包含O_RDONLY, O_WRONLY, or O_RDWR中的任何⼀个**2. int open(const char *pathname, int flags, mode_t mode); UP mode只是在flags中包含O_CREAT时才有效**3. int fsync(int fd); synchronize a file's in-core state with storage device 写完数据close前必须先同步,以防意外**4. off_t lseek(int fd, off_t offset, int whence); 定位⽂件位置第三个参数可以为SEEK_SET SEEK_CUR SEEK_END**5. ssize_t read(int fildes, void *buf, size_t nbyte); UP ⽂件位置会随读取的字节数移动**6. ssize_t write(int fildes, const void *buf, size_t nbyte); UP UP**7. int close(int fd); UP UP**8. void *mmap(void *addr, size_t length, int prot, int flags, 内存映射先⽤fstat得到⽂件⼤⼩,然后使⽤该函数将⽂件内容映射到内存中,然后就可以int fd, off_t offset); 直接调⽤字符串函数操作。

c读取配置文件的方法

c读取配置文件的方法

c读取配置文件的方法在C语言中,读取配置文件是一项非常常见的任务。

配置文件通常包含了程序运行时需要的各种参数和设置,因此读取配置文件是程序启动时必须完成的任务之一。

本文将介绍如何使用C语言读取配置文件。

我们需要了解配置文件的格式。

配置文件通常是一个文本文件,其中包含了一系列的键值对。

每个键值对由一个键和一个值组成,中间用等号连接。

例如:```key1=value1key2=value2key3=value3```在C语言中,我们可以使用标准库中的fopen函数打开配置文件。

例如:```cFILE *fp = fopen("config.ini", "r");```这里我们打开了一个名为config.ini的文件,并以只读模式打开。

接下来,我们可以使用标准库中的fgets函数逐行读取配置文件。

例如:```cchar line[256];while (fgets(line, sizeof(line), fp)) {// 处理每一行}```这里我们定义了一个长度为256的字符数组line,然后使用fgets 函数逐行读取配置文件。

fgets函数的第一个参数是一个字符数组,用于存储读取到的行;第二个参数是字符数组的长度;第三个参数是文件指针,用于指定要读取的文件。

接下来,我们需要解析每一行的键值对。

我们可以使用标准库中的strtok函数将每一行按照等号分割成键和值。

例如:```cchar *key = strtok(line, "=");char *value = strtok(NULL, "=");```这里我们使用strtok函数将line按照等号分割成两个部分,分别是键和值。

strtok函数的第一个参数是要分割的字符串;第二个参数是分割符,这里是等号。

strtok函数会返回分割后的第一个部分,我们可以使用NULL作为第一个参数来获取分割后的第二个部分。

ini文件格式读取

ini文件格式读取

GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串,它的原形是:
GetProfileString(
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址
DWORD nSize // 返回数据的缓冲区长度
);
WriteProfileSection - 将一个整个 Section 的值 写入 Win.ini 文件的指定 Section 中,它的原形是:
WriteProfileSection(
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址
ini 文件是文本文件,中间的数据格式一般为:
[Section1 Name]
KeyName1=value1
KeyName2=value2
...
[Section2 Name]
KeyName1=value1
KeyName2=value2
ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 api,它们是:

嵌入式Linux软件如何进行数据参数保存

嵌入式Linux软件如何进行数据参数保存

嵌入式Linux软件如何进行数据参数保存大多数软件开发都会涉及到数据参数的保存与读取,小至运行的单片机的软件,大至操作系统级别的软件(如linux,windows,mac),均会有专门的子程序或者模块进行参数的保存和读取。

不同的平台下开发,参数的保存与读取会存在一定的差异化,例如,单片机下,保存参数是写入eeprom或者 rom,windows和linux下的软件则会以配置文件的形式保存参数。

下面以我以前在工作中所遇到情况,重点写写嵌入式linux软件是如何进行的数据参数的保存。

一以二进制数据保存参数。

以二进制形式保存参数是很是常见的一种方案,也是很多项目组用于保存参数的一种方案。

以我们现有的软件平台中的方案为例吧。

我们的软件平台基于嵌入式linux,flash芯片容量是16M,flash 芯片被分为了五个区,如下所示,其中parameter 分区用于数据参数的存储。

| uboot | kernel | rootfs | app | parameter |----------------------------------------------------------------------------- uboot 分区对应设备文件/dev/mtdblock0kernel 分区对应设备文件/dev/mtdblock1rootfs 分区对应设备文件/dev/mtdblock2app 分区对应设备文件/dev/mtdblock3parameter 分区对应设备文件/dev/mtdblock4假设我们想要保存用户名与密码。

1 定义一个结构体,结构体成员包含用户名与密码struct _Parameter{char usename[16];char password[16];};int fd = -1;fd = open(/dev/mtdblock5, O_RDWR);struct _Parameter sys_parameter;2 填充sys_parameter的成员usename和password,假若username为dodolook,密码为123456strncpy(sys_ername, &ldquo;dodolook&rdquo;, 16);strncpy(sys_parameter.password, &ldquo;123456&rdquo;, 16);3 将sys_parameter以二进制的形式写入flash分区5的映射的设备文件/dev/mtdblock4. write(fd, &amp;sys_parameter, sizeof(struct _Parameter));参数的读取从设备文件/dev/mtdblock4读取sizeof(struct _Parameter)大小的字节到所定义的参数结构体sys_parameter的变量地址。

Linux常用C函数(文件操作篇)[方案]

Linux常用C函数(文件操作篇)[方案]

Linux 常用C函数(文件操作篇)close(关闭文件)open,fcntl,shutdown,unlink,fclose表头文件 #include<unistd.h>定义函数 int close(int fd);函数说明当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。

参数fd为先前由open()或creat()所返回的文件描述词。

返回值若文件顺利关闭则返回0,发生错误时返回-1。

错误代码 EBADF 参数fd 非有效的文件描述词或该文件已关闭。

附加说明虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。

范例参考open()creat(建立文件)相关函数 read,write,fcntl,close,link,stat,umask,unlink,fopen表头文件 #include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>定义函数 int creat(const char * pathname, mode_tmode);函数说明参数pathname指向欲建立的文件路径字符串。

Creat()相当于使用下列的调用方式调用open()open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC));错误代码关于参数mode请参考open()函数。

返回值 creat()会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。

EEXIST 参数pathname所指的文件已存在。

EACCESS 参数pathname 所指定的文件不符合所要求测试的权限EROFS 欲打开写入权限的文件存在于只读文件系统内EFAULT 参数pathname 指针超出可存取的内存空间EINVAL 参数mode 不正确。

linux c语言 串口读取数据的方法

linux c语言 串口读取数据的方法

linux c语言串口读取数据的方法Linux下使用C语言读取串口数据的方法引言:串口是计算机和外部设备进行通信的一种重要的通信接口。

在Linux系统中,要使用C语言读取串口数据,需要通过打开串口设备文件,设置串口参数,并进行读取数据的操作。

本文将介绍如何通过C语言在Linux下读取串口数据的方法。

目录:1. 了解串口的工作原理2. 打开串口设备文件3. 设置串口参数4. 读取串口数据5. 示例程序6. 总结1. 了解串口的工作原理:在开始编写C语言读取串口数据的方法前,首先需要了解串口的工作原理。

串口是通过硬件电路实现两台设备之间的数据传输,属于一种异步串行通信方式。

典型的串口包含发送数据引脚(TX)、接收数据引脚(RX)、数据位、停止位、奇偶校验位等。

2. 打开串口设备文件:在Linux系统中,每个串口设备都被映射到一个设备文件上,例如/dev/ttyS0代表第一个串口设备,/dev/ttyUSB0代表第一个USB串口设备。

要使用C语言读取串口数据,需要首先打开相应的串口设备文件。

在C语言中,使用open()函数打开串口设备文件。

open()函数的原型如下:cint open(const char *pathname, int flags);其中pathname参数指定要打开的串口设备文件路径,flags参数指定打开方式。

常用的flags参数有O_RDONLY(只读方式打开)、O_WRONLY (只写方式打开)和O_RDWR(读写方式打开)。

例如,要打开第一个串口设备文件,可以调用open()函数如下:cint fd = open("/dev/ttyS0", O_RDWR);if (fd == -1){perror("Error opening serial port");return -1;}当open()函数成功打开串口设备文件时,会返回一个非负整数的文件描述符fd,用于后续的操作。

C,C++跨平台INI文件读写API V0.2.0

C,C++跨平台INI文件读写API V0.2.0

11 #define BUF_SIZE 256
12
13 int main()
14 {
15 const char *file ="myconfig.ini";
16 const char *section = "student";
46 }
47
48 //read age pair, test read int value.
49 //if read fail, return default value
50 age = read_profile_int(section,age_key,0,file);
26 return -1;
27 }
28
29 //write age key value pair
30 if(!write_profile_string(section,age_key,"20",file))
本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
源代码下载地址:/Files/dyj057/inifile0.2.0.zip
描述:
版本0.1.0发布以来,没想到这么受大家关注,也提出一些问题。我把问题整理了一下,重写了部分程序,然后发布为0.2.0版本,欢迎大家使用。
31 {
32 printf("write age pair to ini file fail\n");
33 return -1;
34 }
35
36 printf("[%s]\n",section);

c#操作ini文件

c#操作ini文件

无论在web还是在窗体程序的时候,可能都需要配置文件来保存一些数据,比如登陆QQ 的时候保存帐号密码,网站的保存(网站使用的是cookie与本文无关),那么他们是怎么保存的呢?其实就是创建文件,文字流写入进文件。

就是这么简单。

有人会问,那数据不是不安全了么?我想里面保存的数据安不安全完全看你用什么方式来加密跟创建文件毫无关系。

那么接下来,就用简单的方式来操作配置文件的写法。

代码如下那么如果文件存在了怎么办?根据我现在的业务需求就是如果有配置文件那就读取配置文件的信息操作ini文件的时候我们需要调用win apiDllImport是最常见的就是使用它来调用WIN32的API,例如上面所示。

extern 修饰符用于声明在外部实现的方法。

extern 修饰符的常见用法是在使用Interop 服务调入非托管代码时与DllImport 属性一起使用。

INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中。

这种配置文件的文件扩展名多为INI,故名。

INI是英文“初始化”(initialization)的缩写。

正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。

因为默认创建的是空的配置文件,我们先手动的添加一些东西,[config]的意识是节点名称,类似xml的的节点读取的方式这里的路径我们要写绝对路径,系统要求的,相对路径会查不到。

好了运行后我们会得到UserID这个key的value的值可以试一试哟那么有读取了,上图是读取一个节点,那么如果很多节点写起来就麻烦了很多,我们把这个读的方法抽取出来读取的方式我们搞定了,那么我们来画个窗体做写入事件。

写入的系统函数写入的系统函数写入的系统函数写入方法写入也搞定了,那在窗体界面上我们看到了有一个单选框是否保存密码,大家应该知道怎么做了吧?就到这里~~有问题可以回复,有时间就解答。

(转)linux文件读写的流程

(转)linux文件读写的流程

(转)linux⽂件读写的流程转⾃在《》这篇⽂章中,我们看到⽂件是如何被打开、⽂件的读写是如何被触发的。

对⼀个已打开的⽂件fd进⾏read/write系统调⽤时,内核中该⽂件所对应的file结构的f_op->read/f_op->write被调⽤。

本⽂将顺着这条路⾛下去,⼤致看看普通磁盘⽂件的读写是怎样实现的。

linux内核响应⼀个块设备⽂件读写的层次结构如图(摘⾃ULK3):1、VFS,虚拟⽂件系统。

之前我们已经看到f_op->read/f_op->write如何被调⽤,这就是VFS⼲的事(参见:《》);2、Disk Caches,磁盘⾼速缓存。

将磁盘上的数据缓存在内存中,加速⽂件的读写。

实际上,在⼀般情况下,read/write是只跟缓存打交道的。

(当然,存在特殊情况。

下⾯会说到。

)read就直接从缓存读数据。

如果要读的数据还不在缓存中,则触发⼀次读盘操作,然后等待磁盘上的数据被更新到磁盘⾼速缓存中;write也是直接写到缓存⾥去,然后就不⽤管了。

后续内核会负责将数据写回磁盘。

为了实现这样的缓存,每个⽂件的inode内嵌了⼀个address_space结构,通过inode->i_mapping来访问。

address_space结构中维护了⼀棵radix树,⽤于磁盘⾼速缓存的内存页⾯就挂在这棵树上。

⽽既然磁盘⾼速缓存是跟⽂件的inode关联上的,则打开这个⽂件的每个进程都共⽤同⼀份缓存。

radix树的具体实现细节这⾥可以不⽤关⼼,可以把它理解成⼀个数组。

数组中的每个元素就是⼀个页⾯,⽂件的内容就顺序存放在这些页⾯中。

于是,通过要读写的⽂件pos,可以换算得到要读写的是第⼏页(pos是以字节为单位,只需要除以每个页的字节数即可)。

inode被载⼊内存的时候,对应的磁盘⾼速缓存是空的(radix树上没有页⾯)。

随着⽂件的读写,磁盘上的数据被载⼊内存,相应的内存页被挂到radix树的相应位置上。

VC操作INI

VC操作INI

用VC操作ini配置文件2009年02月13日星期五 10:27Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:GetPrivateProfileInt() 从私有初始化文件获取整型数值GetPrivateProfileString() 从私有初始化文件获取字符串型值GetProfileInt 从win.ini 获取整数值GetProfileString 从win.ini 获取字符串值WritePrivateProfileString 写字符串到私有初始化文件WriteProfileString 写字符串到win.ini我们可以把视图类的:OnInitialUpdate() 函数作为程序启动时读取配置文件的入口,配置文件的存储格式如下:[SECTION 1]XPos=300YPos=200[SECTION 2]Text=Hello仅有两个节,XPos和YPos标明了待显示信息的坐标,而待显示的信息存储在第二节的Text项中,用读取访问私有配置设置文件的API函数将其分别读入到变量m_nXPos,m_nYPos和m_strText中,并通过Invalidate()调用OnDraw()函数,在其内用TextOut函数将该信息在读取的坐标位置显示出来:m_nXPos=GetPrivateProfileInt("SECTION 1", //节名"XPos", //项名0, //没找到此项时的缺省返回值"C:\test\debug\test.ini"); //配置文件的准确路径m_nYPos=GetPrivateProfileInt("SECTION 1","YPos",0,exeFullPath);char buf[256];len=GetPrivateProfileString("SECTION 2", //节名"Text", //项名"No Text", //没找到此项时的返回值buf, //目标缓冲区地址256, //目标缓冲区长度"C:\test\debug\test.ini"); //配置文件的准确路径for(int i=0;i<len;i++){CString str;str.Format("%c",buf[i]);m_strText+=str;}Invalidate();一般配置文件是和应用程序存放在同一个目录中的如果用"C:\test\debug\test.ini"的绝对路径进行设置就会出现路径改变后找不到配置文件的问题,所以应动态搜寻配置文件的存放地址:Tchar exeFullPath[MAX_PATH]; // MAX_PATH在API中有定义,为128int len=GetModuleFileName(NULL,exeFullPath, //应用程序的全路径存放地址MAX_PATH);CString path="\test.ini"; //配置文件名::strcpy(exeFullPath+len-13,path); //组合出配置文件的全路径写配置文件也基本类似,只是需要把数值类型的变量格式化成字符串再行存储:str.Format("%d",m_nXPos);WritePrivateProfileString("SECTION 1","XPos",str,exeFullPath);str.Format("%d",m_nYPos);WritePrivateProfileString("SECTION 1","YPos",str,exeFullPath); WritePrivateProfileString("SECTION 2","Text",m_strText,exeFullPath);我们一定遇到过这样的程序:在执行过一遍以后,重启系统会自动加载该程序,其实除了在启动菜单和注册表添加信息外,也可以用 WriteProfileString()函数向win.ini的"windows"节的"run"项目添加应用程序的全路径来实现,这要比其它两种方法简便的多,而且也比较安全。

CFG、INI配置文件读写C程序

CFG、INI配置文件读写C程序

CFG、INI配置文件读写C程序/******************************************************************** * 文件名称: INIFileOP.C* 文件标识:* 其它说明: INI文件的操作* 当前版本: V1.0* 完成日期:********************************************************************* */#include#include#include/*#undef VOS_WINNT*/#define VOS_WINNT#ifdef VOS_WINNT#define INIFileTstmain main#endif#define SuccessRet 1;#define FailedRet 0;#defineMAX_CFG_BUF512#defineCFG_OK#define CFG_SECTION_NOT_FOUND-1#define CFG_KEY_NOT_FOUND -2#define CFG_ERR -10#define CFG_ERR_FILE -10#define CFG_ERR_OPEN_FILE -10#define CFG_ERR_CREATE_FILE -11#define CFG_ERR_READ_FILE -12#define CFG_ERR_WRITE_FILE -13#define CFG_ERR_FILE_FORMAT -14#define CFG_ERR_SYSTEM -20#define CFG_ERR_SYSTEM_CALL -20#define CFG_ERR_INTERNAL -21#define CFG_ERR_EXCEED_BUF_SIZE -22#define COPYF_OK 0#define COPYF_ERR_OPEN_FILE -10#define COPYF_ERR_CREATE_FILE -11#define COPYF_ERR_READ_FILE -12#define COPYF_ERR_WRITE_FILE -13#define TXTF_OK 0#define TXTF_ERR_OPEN_FILE -1#define TXTF_ERR_READ_FILE -2#define TXTF_ERR_WRITE_FILE -3#define TXTF_ERR_DELETE_FILE -4#define TXTF_ERR_NOT_FOUND -5char CFG_ssl = '[', CFG_ssr = ']';/* 项标志符Section Symbol --可根据特殊需要进行定义更改,如 { }等*/ char CFG_nis = ':'; /*name 与 index 之间的分隔符 */char CFG_nts = '#'; /*注释符*/int CFG_section_line_no, CFG_key_line_no, CFG_key_lines;static char * strtrimr(char * buf);static char * strtriml(char * buf);static int FileGetLine(FILE *fp, char *buffer, intmaxlen);static int SplitKeyValue(char *buf, char **key, char **val);extern int FileCopy(void *source_file, void *dest_file);extern int SplitSectionToNameIndex(char *section, char **name, char **index);extern int JoinNameIndexToSection(char **section, char *name, char *index);extern int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf);extern int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf);extern int ConfigGetSections(void *CFG_file, char *sections[]); extern int ConfigGetKeys(void *CFG_file, void *section, char *keys[]);extern void INIFileTstmain(void);/******************************************************************** *** 函数名称: strtrimr* 功能描述:去除字符串右边的空字符* 访问的表:无* 修改的表:无* 输入参数: char * buf 字符串指针* 输出参数:无* 返回值:字符串指针* 其它说明:无********************************************************************/ char * strtrimr(char * buf){intlen,i;char * tmp = NULL;len = strlen(buf);tmp = (char*)malloc(len);memset(tmp,0x00,len);for(i = 0;i <len;i++){if (buf[i] !=' ')break;}if (i<len) {strncpy(tmp,(buf+i),(len-i));}strncpy(buf,tmp,len);free(tmp);return buf;}/******************************************************************** *** 函数名称: strtriml* 功能描述:去除字符串左边的空字符* 访问的表:无* 修改的表:无* 输入参数: char * buf 字符串指针* 输出参数:无* 返回值:字符串指针* 其它说明:无********************************************************************* **/char * strtriml(char * buf){intlen,i;char * tmp=NULL;len = strlen(buf);tmp = (char*)malloc(len);memset(tmp,0x00,len);for(i = 0;i <len;i++){if (buf[len-i-1] !=' ')break;}if (i<len) {strncpy(tmp,buf,len-i);}strncpy(buf,tmp,len);free(tmp);return buf;}/******************************************************************** *** 函数名称: FileGetLine* 功能描述:从文件中读取一行* 访问的表:无* 修改的表:无* 输入参数: FILE *fp 文件句柄;intmaxlen 缓冲区最大长度* 输出参数: char *buffer 一行字符串* 返回值:实际读的长度* 其它说明:无********************************************************************* **/int FileGetLine(FILE *fp, char *buffer, intmaxlen){int i, j;char ch1;for(i = 0, j = 0; i<maxlen; j++){if(fread(&ch1, sizeof(char), 1, fp) != 1){if(feof(fp) != 0){if(j == 0) return -1; /* 文件结束 */else break;}if(ferror(fp) != 0) return -2; /* 读文件出错 */return -2;}else{if(ch1 == '\n' || ch1 == 0x00) break; /* 换行 */if(ch1 == '\f' || ch1 == 0x1A) /* '\f':换页符也算有效字符 */ {buffer[i++] = ch1;break;}if(ch1 != '\r') buffer[i++] = ch1; /* 忽略回车符 */ }}buffer[i] = '\0';return i;}/******************************************************************** *** 函数名称: FileCopy* 功能描述:文件拷贝* 访问的表:无* 修改的表:无* 输入参数: void *source_file 源文件void *dest_file 目标文件* 输出参数:无* 返回值: 0 -- OK,非0--失败* 其它说明:无********************************************************************* **/int FileCopy(void *source_file, void *dest_file){FILE *fp1, *fp2;char buf[1024+1];int ret;if((fp1 = fopen((char *)source_file, "r")) == NULL)return COPYF_ERR_OPEN_FILE;ret = COPYF_ERR_CREATE_FILE;if((fp2 = fopen((char *)dest_file, "w")) == NULL) gotocopy_end;while(1){ret = COPYF_ERR_READ_FILE;memset(buf, 0x00, 1024+1);if(fgets((char *)buf, 1024, fp1) == NULL){if(strlen(buf) == 0){if(ferror(fp1) != 0) gotocopy_end;break; /* 文件尾 */}}ret = COPYF_ERR_WRITE_FILE;if(fputs((char *)buf, fp2) == EOF) gotocopy_end;}ret = COPYF_OK;copy_end:if(fp2 != NULL) fclose(fp2);if(fp1 != NULL) fclose(fp1);return ret;}/******************************************************************** *** 函数名称: SplitSectionToNameIndex* 功能描述:分离section为name和index* [section]* / \* name:index* jack : 12* | | |* k1 k2 i* 访问的表:无* 修改的表:无* 输入参数: char *section* 输出参数: char **name, char **index* 返回值: 1 --- ok* 0 --- blank line* -1 --- no name, ":index"* -2 --- only name, no ':'* 其它说明:无********************************************************************/ int SplitSectionToNameIndex(char *section, char **name, char **index) {int i, k1, k2, n;if((n = strlen((char *)section)) < 1) return 0;for(i = 0; i< n; i++)if(section[i] != ' ' && section[i] != '\t') break;if(i>= n) return 0;if(section[i] == CFG_nis) return -1;k1 = i;for(i++; i< n; i++)if(section[i] == CFG_nis) break;if(i>= n) return -2;k2 = i;for(i++; i< n; i++)if(section[i] != ' ' && section[i] != '\t') break;section[k2] = '\0';*name = section + k1;*index = section + i;return 1;}/******************************************************************** *** 函数名称: JoinNameIndexToSection* 功能描述:合成name和indexsection为section* jack : 12* name:index* \ /* [section]* 访问的表:无* 修改的表:无* 输入参数: char *name, char *index* 输出参数: char **section* 返回值: 1 --- ok* 0 --- blank line* 其它说明:无********************************************************************/ int JoinNameIndexToSection(char **section, char *name, char *index)int n1,n2;if((n1 = strlen((char *)name)) < 1) return 0;if((n2 = strlen((char *)index)) < 1) return 0;strcat(*section,name);strcat(*section+n1,":");strcat(*section+n1+1,index);*(*section+n1+1+n2) = '\0';return 1;}/******************************************************************** *** 函数名称: SplitKeyValue* 功能描述:分离key和value* key=val* jack = liaoyuewang* | | |* k1 k2 i* 访问的表:无* 修改的表:无* 输入参数: char *buf* 输出参数: char **key;char **val* 返回值: 1 --- ok* 0 --- blank line* -1 --- no key, "= val"* -2 --- only key, no '='* 其它说明:无********************************************************************/ int SplitKeyValue(char *buf, char **key, char **val){int i, k1, k2, n;if((n = strlen((char *)buf)) < 1) return 0;for(i = 0; i< n; i++)if(buf[i] != ' ' &&buf[i] != '\t') break;if(i>= n) return 0;if(buf[i] == '=') return -1;k1 = i;for(i++; i< n; i++)if(buf[i] == '=') break;if(i>= n) return -2;k2 = i;for(i++; i< n; i++)if(buf[i] != ' ' &&buf[i] != '\t') break;buf[k2] = '\0';*key = buf + k1;*val = buf + i;return 1;}/******************************************************************** *** 函数名称: ConfigGetKey* 功能描述:获得key的值* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件;void *section 项值;void *key 键值* 输出参数: void *buf key的值* 返回值: 0 --- ok 非0 --- error* 其它说明:无********************************************************************/ int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf) {FILE *fp;char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];char *key_ptr, *val_ptr;int line_no, n, ret;line_no = 0;CFG_section_line_no = 0;CFG_key_line_no = 0;CFG_key_lines = 0;if((fp = fopen((char *)CFG_file, "rb")) == NULL) returnCFG_ERR_OPEN_FILE;while(1) /* 搜找项section */{ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf1, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;ret = CFG_SECTION_NOT_FOUND;if(n < 0) gotor_cfg_end; /* 文件尾,未发现 */line_no++;n = strlen(strtriml(strtrimr(buf1)));if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行或注释行 */ ret = CFG_ERR_FILE_FORMAT;if(n > 2 && ((buf1[0] == CFG_ssl&& buf1[n-1] != CFG_ssr))) gotor_cfg_end;if(buf1[0] == CFG_ssl){buf1[n-1] = 0x00;if(strcmp(buf1+1, section) == 0)break; /* 找到项section */}}CFG_section_line_no = line_no;while(1) /* 搜找key */{ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf1, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;ret = CFG_KEY_NOT_FOUND;if(n < 0) gotor_cfg_end; /* 文件尾,未发现key */line_no++;CFG_key_line_no = line_no;CFG_key_lines = 1;n = strlen(strtriml(strtrimr(buf1)));if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行或注释行 */ ret = CFG_KEY_NOT_FOUND;if(buf1[0] == CFG_ssl) gotor_cfg_end;if(buf1[n-1] == '+') /* 遇+号表示下一行继续 */ {buf1[n-1] = 0x00;while(1){ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf2, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;if(n < 0) break; /* 文件结束 */line_no++;CFG_key_lines++;n = strlen(strtrimr(buf2));ret = CFG_ERR_EXCEED_BUF_SIZE;if(n > 0 && buf2[n-1] == '+') /* 遇+号表示下一行继续 */ {buf2[n-1] = 0x00;if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)gotor_cfg_end;strcat(buf1, buf2);continue;}if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)gotor_cfg_end;strcat(buf1, buf2);break;}}ret = CFG_ERR_FILE_FORMAT;if(SplitKeyValue(buf1, &key_ptr, &val_ptr) != 1)gotor_cfg_end;strtriml(strtrimr(key_ptr));if(strcmp(key_ptr, key) != 0)continue;/* 和key值不匹配 */strcpy(buf, val_ptr);break;}ret = CFG_OK;r_cfg_end:if(fp != NULL) fclose(fp);return ret;}/******************************************************************** *** 函数名称: ConfigSetKey* 功能描述:设置key的值* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件;void *section 项值;* void *key 键值;void *buf key的值* 输出参数:无* 返回值: 0 --- ok 非0 --- error* 其它说明:无********************************************************************/ int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf) {FILE *fp1, *fp2;char buf1[MAX_CFG_BUF + 1];int line_no, line_no1, n, ret, ret2;char *tmpfname;ret = ConfigGetKey(CFG_file, section, key, buf1);if(ret <= CFG_ERR && ret != CFG_ERR_OPEN_FILE) return ret;if(ret == CFG_ERR_OPEN_FILE || ret == CFG_SECTION_NOT_FOUND) {if((fp1 = fopen((char *)CFG_file, "a")) == NULL)return CFG_ERR_CREATE_FILE;if(fprintf(fp1, "%c%s%c\n", CFG_ssl, section, CFG_ssr) == EOF) {fclose(fp1);return CFG_ERR_WRITE_FILE;}if(fprintf(fp1, "%s=%s\n", key, buf) == EOF){fclose(fp1);return CFG_ERR_WRITE_FILE;}fclose(fp1);return CFG_OK;}if((tmpfname = tmpnam(NULL)) == NULL)return CFG_ERR_CREATE_FILE;if((fp2 = fopen(tmpfname, "w")) == NULL)return CFG_ERR_CREATE_FILE;ret2 = CFG_ERR_OPEN_FILE;if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) gotow_cfg_end;if(ret == CFG_KEY_NOT_FOUND)line_no1 = CFG_section_line_no;else /* ret = CFG_OK */line_no1 = CFG_key_line_no - 1;for(line_no = 0; line_no< line_no1; line_no++){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < 0) gotow_cfg_end;ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s\n", buf1) == EOF) gotow_cfg_end;}if(ret != CFG_KEY_NOT_FOUND)for( ; line_no< line_no1+CFG_key_lines; line_no++){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < 0) gotow_cfg_end;}ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s=%s\n", key, buf) == EOF) gotow_cfg_end;while(1){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < -1) gotow_cfg_end;if(n < 0) break;ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s\n", buf1) == EOF) gotow_cfg_end;}ret2 = CFG_OK;w_cfg_end:if(fp1 != NULL) fclose(fp1);if(fp2 != NULL) fclose(fp2);if(ret2 == CFG_OK){ret = FileCopy(tmpfname, CFG_file);if(ret != 0) return CFG_ERR_CREATE_FILE;}remove(tmpfname);return ret2;}/******************************************************************** *** 函数名称: ConfigGetSections* 功能描述:获得所有section* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件* 输出参数: char *sections[] 存放section名字* 返回值:返回section个数。

INI文件格式及其读写相关内容

INI文件格式及其读写相关内容

VC中用函数读写ini文件的方法原文地址/ncre2/cpp/jiqiao/20100705/082550499.htmlini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。

ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。

读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

一、向ini文件中写入信息的函数1. 把信息写入系统的win.ini文件BOOL WriteProfileString(LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。

若为NULL,则删除整个节LPCTSTR lpString // 键的值,是一个以0结束的字符串。

若为NULL,则删除对应的键)2. 把信息写入自己定义的.ini文件BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上LPCTSTR lpString, // 同上LPCTSTR lpFileName // 要写入的文件的文件名。

若该ini文件与程序在同一个目录下,// 也可使用相对路径,否则需要给出绝度路径。

)如:::WriteProfileString("Test", "id", "xym");// 在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym::WritePrivateProfileString("Test", "id", "xym", "d:\\vc\\Ex1\\ex1.ini");// 在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym// 若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:::WritePrivateProfileString("Test", "id", "xym", ".\\ex1.ini");需要注意的是,C系列的语言中,转义字符“\\”表示反斜线“\”。

C#读写config配置文件的方法

C#读写config配置文件的方法

C#读写config配置⽂件的⽅法如下所⽰:<?xml version="1.0" encoding="utf-8" ?><configuration><appSettings><add key="ServerIP" value="127.0.0.1"></add><add key="DataBase" value="WarehouseDB"></add><add key="user" value="sa"></add><add key="password" value="sa"></add></appSettings></configuration>对config配置⽂件的读写类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Configuration;using System.ServiceModel;using System.ServiceModel.Configuration;namespace NetUtilityLib{public static class ConfigHelper{//依据连接串名字connectionName返回数据连接字符串public static string GetConnectionStringsConfig(string connectionName){//指定config⽂件读取string file = System.Windows.Forms.Application.ExecutablePath;System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(file);string connectionString =config.ConnectionStrings.ConnectionStrings[connectionName].ConnectionString.ToString();return connectionString;}///<summary>///更新连接字符串///</summary>///<param name="newName">连接字符串名称</param>///<param name="newConString">连接字符串内容</param>///<param name="newProviderName">数据提供程序名称</param>public static void UpdateConnectionStringsConfig(string newName, string newConString, string newProviderName) {//指定config⽂件读取string file = System.Windows.Forms.Application.ExecutablePath;Configuration config = ConfigurationManager.OpenExeConfiguration(file);bool exist = false; //记录该连接串是否已经存在//如果要更改的连接串已经存在if (config.ConnectionStrings.ConnectionStrings[newName] != null){exist = true;}// 如果连接串已存在,⾸先删除它if (exist){config.ConnectionStrings.ConnectionStrings.Remove(newName);}//新建⼀个连接字符串实例ConnectionStringSettings mySettings =new ConnectionStringSettings(newName, newConString, newProviderName);// 将新的连接串添加到配置⽂件中.config.ConnectionStrings.ConnectionStrings.Add(mySettings);// 保存对配置⽂件所作的更改config.Save(ConfigurationSaveMode.Modified);// 强制重新载⼊配置⽂件的ConnectionStrings配置节ConfigurationManager.RefreshSection("ConnectionStrings");}///<summary>///返回*.exe.config⽂件中appSettings配置节的value项///</summary>///<param name="strKey"></param>///<returns></returns>public static string GetAppConfig(string strKey){string file = System.Windows.Forms.Application.ExecutablePath;Configuration config = ConfigurationManager.OpenExeConfiguration(file);foreach (string key in config.AppSettings.Settings.AllKeys){if (key == strKey){return config.AppSettings.Settings[strKey].Value.ToString();}}return null;}///<summary>///在*.exe.config⽂件中appSettings配置节增加⼀对键值对///</summary>///<param name="newKey"></param>///<param name="newValue"></param>public static void UpdateAppConfig(string newKey, string newValue){string file = System.Windows.Forms.Application.ExecutablePath;Configuration config = ConfigurationManager.OpenExeConfiguration(file);bool exist = false;foreach (string key in config.AppSettings.Settings.AllKeys){if (key == newKey){exist = true;}}if (exist){config.AppSettings.Settings.Remove(newKey);}config.AppSettings.Settings.Add(newKey, newValue);config.Save(ConfigurationSaveMode.Modified);ConfigurationManager.RefreshSection("appSettings");}// 修改system.serviceModel下所有服务终结点的IP地址public static void UpdateServiceModelConfig(string configPath, string serverIP){Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);ConfigurationSectionGroup sec = config.SectionGroups["system.serviceModel"];ServiceModelSectionGroup serviceModelSectionGroup = sec as ServiceModelSectionGroup;ClientSection clientSection = serviceModelSectionGroup.Client;foreach (ChannelEndpointElement item in clientSection.Endpoints){string pattern = @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b";string address = item.Address.ToString();string replacement = string.Format("{0}", serverIP);address = Regex.Replace(address, pattern, replacement);item.Address = new Uri(address);}config.Save(ConfigurationSaveMode.Modified);ConfigurationManager.RefreshSection("system.serviceModel");}// 修改applicationSettings中App.Properties.Settings中服务的IP地址public static void UpdateConfig(string configPath, string serverIP){Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);ConfigurationSectionGroup sec = config.SectionGroups["applicationSettings"];ConfigurationSection configSection = sec.Sections["DataService.Properties.Settings"];ClientSettingsSection clientSettingsSection = configSection as ClientSettingsSection;if (clientSettingsSection != null){SettingElement element1 = clientSettingsSection.Settings.Get("DataService_SystemManagerWS_SystemManagerWS"); if (element1 != null){clientSettingsSection.Settings.Remove(element1);string oldValue = element1.Value.ValueXml.InnerXml;element1.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);clientSettingsSection.Settings.Add(element1);}SettingElement element2 = clientSettingsSection.Settings.Get("DataService_EquipManagerWS_EquipManagerWS");if (element2 != null){clientSettingsSection.Settings.Remove(element2);string oldValue = element2.Value.ValueXml.InnerXml;element2.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);clientSettingsSection.Settings.Add(element2);}}config.Save(ConfigurationSaveMode.Modified);ConfigurationManager.RefreshSection("applicationSettings");}private static string GetNewIP(string oldValue, string serverIP){string pattern = @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b";string replacement = string.Format("{0}", serverIP);string newvalue = Regex.Replace(oldValue, pattern, replacement);return newvalue;}}}测试代码如下:class Program{static void Main(string[] args){try{//string file = System.Windows.Forms.Application.ExecutablePath + ".config";//string file1 = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;string serverIP = ConfigHelper.GetAppConfig("ServerIP");string db = ConfigHelper.GetAppConfig("DataBase");string user = ConfigHelper.GetAppConfig("user");string password = ConfigHelper.GetAppConfig("password");Console.WriteLine(serverIP);Console.WriteLine(db);Console.WriteLine(user);Console.WriteLine(password);ConfigHelper.UpdateAppConfig("ServerIP", "192.168.1.11");string newIP = ConfigHelper.GetAppConfig("ServerIP");Console.WriteLine(newIP);Console.ReadKey();}catch (Exception ex){Console.WriteLine(ex.Message);}}}以上这篇C#读写config配置⽂件的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

linux内核中读写文件数据的方法

linux内核中读写文件数据的方法

linux内核中读写文件数据的方法有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据。

在kernel 中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有:filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,这些函数在linux/fs.h和asm/uaccess.h 头文件中声明。

下面介绍主要步骤1. 打开文件filp_open()在kernel中可以打开文件,其原形如下:strcut file* filp_open(const char* filename, int open_mode, int mode);该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。

参数说明filename:表明要打开或创建文件的名称(包括路径部分)。

在内核中打开的文件时需要注意打开的时机,很容易出现需要打开文件的驱动很早就加载并打开文件,但需要打开的文件所在设备还不有挂载到文件系统中,而导致打开失败。

open_mode:文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。

mode:创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为02. 读写文件kernel中文件的读写操作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和set_fs()这两个函数。

vfs_read() vfs_write()两函数的原形如下:ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);注意这两个函数的第二个参数buffer,前面都有__user修饰符,这就要求这两个buffer 指针都应该指向用空的内存,如果对该参数传递kernel空间的指针,这两个函数都会返回失败-EFAULT。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
break; } else {
szLine[i++] = rtnval; } if(rtnval == '\n') {
szLine[--i] = '\n'; i = 0;
1/3
tmp = strchr(szLine, '='); if((tmp != NULL) && (flag == 1)) {
if(strstr(szLine, key)Байду номын сангаас!= NULL) {
//comment if('#' == szLine[0]); else if('/' == szLine[0] && '/' == szLine[1]); else {
//local key position strcpy(tmpstr, tmp+1); fclose(fp); return tmpstr; } } } else { strcpy(tmpstr, "["); strcat(tmpstr, title); strcat(tmpstr, "]"); if(strncmp(tmpstr, szLine, strlen(tmpstr)) == 0) { //encounter title flag = 1; } } } } fclose(fp); return ""; } int get_int_from_ini(char *title, char *key, char *filename) { return atoi(get_string_from_ini(title, key, filename)); } int main(int argc, char **argv) { char name[1024]; int age = 0; memset(name, 0, sizeof(name)); age = get_int_from_ini("test", "age", argv[1]); strcpy(name, get_string_from_ini("test", "name", argv[1])); //puts(name); printf("%s", name); printf("age = %d\n", age); }
2/3
3/3
读取配置文件的程序: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <stdarg.h> //read string from config file char *get_string_from_ini(char *title, char *key, char *filename) {
ini格式
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容, 但是在Linux平台上就一筹莫展了。 为了解决该问题,打算用C来读取.ini,就可以不受平台的限制了。 配置文件Config.ini [test] name=elikang age=12
FILE *fp; char szLine[1024]; static char tmpstr[1024]; int rtnval; int i = 0; int flag = 0; char *tmp; if((fp = fopen(filename, "r")) == NULL) {
perror("fopen()"); return NULL; } while(!feof(fp)) { rtnval = fgetc(fp); if(rtnval == EOF) {
相关文档
最新文档