1、可随意修改内容
/*
* Author:aniu12<gdzengxiong@gmail.com>
* Date: 2014.02.13
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
/*
*linebuffer:读取文件中的一行存入的缓冲
*buffer1:一行中第一个字段的存入缓冲
*buffer2:一行中第二个字段的存入缓冲
*/
char linebuffer[512] = {0};
char buffer1[512] = {0};
char buffer2[512] = {0};
char save[100][512];
memset(save, 0, sizeof(save));
int line_len = 0;
int len = 0;
int res;
int i=0;
int j=0;
int k=0;
/*
* cc.cfg是文件名,r+代表可以读写文件
*/
FILE *fp = fopen("test.txt", "r+");
if(fp == NULL)
{
printf("open error");
return -1;
}
/*
* 复制文件内容到缓存数组save[][]中
*/
while(fgets(save[i], 512, fp))
{
i++;
}
fseek(fp,0,SEEK_SET);
while(fgets(linebuffer, 512, fp))
{
k++;
/*
* 在文件中查找符合条件的那一行内容,并记录当前行数
*/
sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
if(!strcmp("wireless.1.current_state", buffer1))
{
k--;
break;
}
}
/*
* 将要修改的内容写入缓存中
*/
strcpy(buffer2, "=311\0");
strcat(buffer1, buffer2);
buffer1[strlen(buffer1)]='\n';
printf("%d\n",strlen(buffer1));
printf("%s\n",buffer1);
memset(save[k], 0, 512);
strncpy(save[k],buffer1,512);
/*
* 清空文件内容
*/
fseek(fp,0,SEEK_SET);
truncate("./test.txt",0);//clean test.txt
/*
* 将缓存中的数据按行写入文件中
*/
fseek(fp,0,SEEK_SET);
for(j=0;j<i;j++)
{
fwrite(save[j],strlen(save[j]),1,fp);
}
fclose(fp);
return 0;
}
2、Shell中sed命令的C语言实现
/*
* Author:aniu12<gdzengxiong@gmail.com>
* Date: 2013.02.13
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
/*
*linebuffer:读取文件中的一行存入的缓冲
*buffer1:一行中第一个字段的存入缓冲
*buffer2:一行中第二个字段的存入缓冲
*/
char linebuffer[512] = {0};
char buffer1[512] = {0};
char buffer2[512] = {0};
char save[100][512];
memset(save, 0, sizeof(save));
int line_len = 0;
int len = 0;
int res;
int i=0;
int j=0;
/*
* cc.cfg是文件名,r+代表可以读写文件
*/
FILE *fp = fopen("test.txt", "r+");
if(fp == NULL)
{
printf("open error");
return -1;
}
while(fgets(linebuffer, 512, fp))
{
line_len = strlen(linebuffer);
len += line_len;
/*
* buffer1=wireless.1.current_state
* buffer2=1
*/
sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
if(!strcmp("wireless.1.current_state", buffer1))
{
/*
* 由于已经找到所需要写的位置,所以需要写位置的“头”
*/
len -= strlen(linebuffer);
/*
* 实现文件位置的偏移,为写文件做准备
*/
res = fseek(fp, len, SEEK_SET);
if(res < 0)
{
perror("fseek");
return -1;
}
//memset(buffer2,0,sizeof(buffer2));
strcpy(buffer2, "=311");
/*strcat(buffer1, "=");*/
strcat(buffer1, buffer2);
printf("%d\n",strlen(buffer1));
/*
* 写文件,存入所需的内容
*/
fprintf(fp, "%s", buffer1);
fclose(fp);
return;
}
}
return 0;
}
3、C 语言读写配置文件
/*
* File: read and write ConfigFile
* Author:aniu12<gdzengxiong@gmail.com>
* Date: 2014.02.13
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define FILE_NAME "./sound.ini"
#define READ_MODE "r+"
#define BUFFER_SIZE 38
#define BUFFER_NUM 2
#define SPK_KW "spk"
#define MIC_KW "mic"
int Write_Line_Data ( char *path, int data, unsigned char *keyword )
{
/*
*linebuffer:读取文件中的一行存入的缓冲
*buffer1:一行中第一个字段的存入缓冲
*buffer2:一行中第二个字段的存入缓冲
*/
char linebuffer[BUFFER_SIZE] = {0};
char buffer1[BUFFER_SIZE] = {0};
char buffer2[BUFFER_SIZE] = {0};
char save[BUFFER_NUM][BUFFER_SIZE];
int i=0;
int j=0;
int k=0;
memset ( save, 0, sizeof(save) );
/*
* FILE_NAME是文件名,r+代表可以读写文件
*/
FILE *fp = fopen ( path, READ_MODE );
if ( fp == NULL )
{
printf ( "open error" );
return -1;
}
/*
* 复制文件内容到缓存数组save[][]中
*/
while ( fgets(save[i], BUFFER_SIZE, fp) )
{
i++;
}
fseek ( fp,0,SEEK_SET );//重新定位到文件开始处
while(fgets(linebuffer, BUFFER_SIZE, fp))
{
k++;
/*
* 在文件中查找符合条件的那一行内容,并记录当前行数
*/
sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
if ( !strcmp (keyword, buffer1) )
{
k--;
break;
}
}
/*
* 将要修改的内容写入缓存中
*/
sprintf ( buffer2, "%d", data );//将整数转换成字符串
buffer2[strlen(buffer2)] = '\n';
buffer1[strlen(buffer1)] = '=';
strcat(buffer1, buffer2);
strncpy(save[k],buffer1,BUFFER_SIZE);
/*
* 清空文件内容
*/
fseek(fp,0,SEEK_SET);
truncate("./test.txt",0);//clean test.txt
/*
* 将缓存中的数据按行写入文件中
*/
fseek(fp,0,SEEK_SET);
for(j=0;j<i;j++)
{
fwrite(save[j],strlen(save[j]),1,fp);
}
fclose(fp);
return 0;
}
void String_Isdigit(char *src, char *dst)
{
int i = 0;
while ( src[i] != '\0' )
{
if (isdigit(src[i]))
dst[i] = src[i];
else dst[i] = ' ';
++i;
}
dst[i] = '\0';
}
int Read_Line_Data ( char *path, int data, char *keyword )
{
/*
*linebuffer:读取文件中的一行存入的缓冲
*buffer1:一行中第一个字段的存入缓冲
*buffer2:一行中第二个字段的存入缓冲
*/
char linebuffer[BUFFER_SIZE] = {0};
char buffer1[BUFFER_SIZE] = {0};
char buffer2[BUFFER_SIZE] = {0};
/*
* FILE_NAME是文件名,r+代表可以读写文件
*/
FILE *fp = fopen(path, READ_MODE);
if ( fp == NULL )
{
printf ( "open error" );
return -1;
}
while(fgets(linebuffer, BUFFER_SIZE, fp))
{
/*
* 在文件中查找符合条件的那一行内容
*/
sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
if ( !strcmp (keyword, buffer1) )
{
break;
}
}
/*
* 将要修改的内容写入缓存中
*/
memset ( buffer1, 0, sizeof(buffer1) );
String_Isdigit (buffer2,buffer1 );
sscanf ( buffer1, "%d", &data );
printf("%s=%d\n", keyword, data);
fclose(fp);
return 0;
}
int main ( int argc, char **argv )
{
int mic_data = 0;
int spk_data = 0;
if ( argc <3 )
{
printf("It need 3 params!\n");
return -1;
}
mic_data = atoi ( argv[2] );
spk_data = atoi ( argv[1] );
Write_Line_Data ( FILE_NAME, spk_data, SPK_KW );
Write_Line_Data ( FILE_NAME, mic_data, MIC_KW );
Read_Line_Data ( FILE_NAME, spk_data, SPK_KW );
Read_Line_Data ( FILE_NAME, mic_data, MIC_KW );
return 0;
}
sound.ini
spk=122
mic=335