嵌入式 linux读取按行读写文本文件

原创 2013年12月02日 14:53:39
  1. #include <</SPAN>stdio.h>
  2. #include <</SPAN>unistd.h>
  3. #include <</SPAN>fcntl.h>
  4. #include <</SPAN>string.h>
  5. #include <</SPAN>malloc.h>
  6. #include <</SPAN>stdlib.h>


  7. typedef struct item_t {
  8. char *key;
  9. char *value;
  10. }ITEM;

  11. /*
  12. *去除字符串右端空格
  13. */
  14. char *strtrimr(char *pstr)
  15. {
  16. int i;
  17. i = strlen(pstr) - 1;
  18. while (isspace(pstr[i]) && (i >= 0))
  19. pstr[i--] = '\0';
  20. return pstr;
  21. }
  22. /*
  23. *去除字符串左端空格
  24. */
  25. char *strtriml(char *pstr)
  26. {
  27. int i = 0,j;
  28. j = strlen(pstr) - 1;
  29. while (isspace(pstr[i]) && (i <</SPAN>= j))
  30. i++;
  31. if (0<</SPAN>i)
  32. strcpy(pstr,&pstr[i]);
  33. return pstr;
  34. }
  35. /*
  36. *去除字符串两端空格
  37. */
  38. char *strtrim(char *pstr)
  39. {
  40. char *p;
  41. p =strtrimr(pstr);
  42. return strtriml(p);
  43. }


  44. /*
  45. *从配置文件的一行读出key或value,返回item指针
  46. *line--从配置文件读出的一行
  47. */
  48. intget_item_from_line(char*line, struct item_t *item)
  49. {
  50. char *p = strtrim(line);
  51. int len = strlen(p);
  52. if(len <</SPAN>= 0){
  53. return 1;//空行
  54. }
  55. else if(p[0]=='#'){
  56. return 2;
  57. }else{
  58. char *p2 = strchr(p, '=');
  59. *p2++ = '\0';
  60. item->key = (char *)malloc(strlen(p) + 1);
  61. item->value = (char *)malloc(strlen(p2) + 1);
  62. strcpy(item->key,p);
  63. strcpy(item->value,p2);

  64. }
  65. return 0;//查询成功
  66. }

  67. intfile_to_items(const char *file, struct item_t *items, int *num)
  68. {
  69. char line[1024];
  70. FILE *fp;
  71. fp = fopen(file,"r");
  72. if(fp == NULL)
  73. return 1;
  74. int i = 0;
  75. while(fgets(line, 1023, fp))
  76. {
  77. char *p = strtrim(line);
  78. int len = strlen(p);
  79. if(len <</SPAN>= 0)
  80. {
  81. continue;
  82. }
  83. else if(p[0]=='#')
  84. {
  85. continue;
  86. }
  87. else
  88. {
  89. char *p2 = strchr(p, '=');
  90. /*这里认为只有key没什么意义*/
  91. if(p2 == NULL)
  92. continue;
  93. *p2++ = '\0';
  94. items[i].key = (char *)malloc(strlen(p) + 1);
  95. items[i].value = (char *)malloc(strlen(p2) + 1);
  96. strcpy(items[i].key,p);
  97. strcpy(items[i].value,p2);

  98. i++;
  99. }
  100. }
  101. (*num) = i;
  102. fclose(fp);
  103. return 0;
  104. }

  105. /*
  106. *读取value
  107. */
  108. intread_conf_value(const char *key,char *value1,const char *file)
  109. {
  110. char line[1024];
  111. char *key1,*key3,*key2;
  112. FILE *fp;
  113. fp = fopen(file,"r");
  114. if(fp == NULL)
  115. return 1;//文件打开错误
  116. while (fgets(line, 1023, fp)){
  117. ITEM item;
  118. get_item_from_line(line,&item);
  119. if(!strcmp(item.key,key)){

  120. strcpy(value1,item.value);
  121. fclose(fp);
  122. free(item.key);
  123. free(item.value);
  124. break;
  125. }
  126. }
  127. return 0;//成功

  128. }
  129. intwrite_conf_value(const char *key,char *value,const char *file)
  130. {
  131. ITEM items[20];// 假定配置项最多有20个
  132. int num;//存储从文件读取的有效数目
  133. file_to_items(file, items, &num);

  134. int i=0;
  135. //查找要修改的项
  136. for(i=0;i<</SPAN>num;i++){
  137. if(!strcmp(items[i].key, key)){
  138. items[i].value = value;
  139. break;
  140. }
  141. }

  142. // 更新配置文件,应该有备份,下面的操作会将文件内容清除
  143. FILE *fp;
  144. fp = fopen(file, "w");
  145. if(fp == NULL)
  146. return 1;

  147. i=0;
  148. for(i=0;i<</SPAN>num;i++){
  149. fprintf(fp,"%s=%s\n",items[i].key, items[i].value);
  150. //printf("%s=%s\n",items[i].key, items[i].value);
  151. }
  152. fclose(fp);
  153. //清除工作
  154. /*i=0;
  155. for(i=0;i<</SPAN>num;i++){
  156. free(items[i].key);
  157. free(items[i].value);
  158. }*/

  159. return 0;

  160. }

  161. void main(void)
  162. {
  163. char *key;
  164. char *value=NULL,*value1=NULL;
  165. char *file;
  166. file="/home/wangwei/ww/file/from_file";

  167. key="IP";
  168. value=(char *)malloc(sizeof(char)*30);
  169. value1=(char *)malloc(sizeof(char)*30);
  170. read_conf_value(key,value,file);
  171. printf("IP = %s\n",value);

  172. key="MASK";
  173. read_conf_value(key,value,file);
  174. printf("MASK = %s\n",value);

  175. key="GATEWAY";
  176. read_conf_value(key,value,file);
  177. printf("GATEWAY = %s\n",value);
  178. free(value);
  179. free(value1);
  180. value=NULL;
  181. value1=NULL;
  182. }

相关文章推荐

linux读取按行读写文本文件

#include stdio.h> #include unistd.h> #include fcntl.h> #include string.h> #include malloc.h> #i...

嵌入式 Linux 对内存的直接读写(devmem)

【摘要】这个工具的原理也比较简单,就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。...

嵌入式 Linux 对内存的直接读写(devmem)

转载http://blog.csdn.net/xy010902100449/article/details/47028497 【摘要】 在Linux开发中着实用到的调试工具并不是很多。devm...

【N32926】简单测试ARM Linux嵌入式系Nand存储读写速度

在某些情况下,我们想知道NAND Flash的大概读写速度,这些情况可能包括: 1.打算更换一颗型号不同但存储类型、存储容量、页大小都相同的NAND 2.打算更换一颗存储类型不同的NAND,例如从S...

嵌入式计算机AD读写

  • 2013年12月26日 16:57
  • 22.16MB
  • 下载

NAND Flash--嵌入式NAND Flash读写技术

原文地址  http://blogold.chinaunix.net/u2/72003/showart_1931513.htmlNAND Flash控制器 S3C2410板的Nand Flash支持由...

usb118嵌入式U盘读写模块

  • 2009年06月25日 22:17
  • 10.16MB
  • 下载

以行为单位读写文本文件

  • 2012年10月14日 13:34
  • 55KB
  • 下载

嵌入式 shell用一行命令统计一文本文件中包含指定字符串出现次数

打印指定行: sed -n “1,2p”文件名· $grep -c 'I am tom' a.txt   参考资料:   grep、fgrep和egrep命令     这组命令以指定模式搜索文件,...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:41
  • 1640

以流式方式读写文本文件

  • 2015年10月04日 13:23
  • 10KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 linux读取按行读写文本文件
举报原因:
原因补充:

(最多只允许输入30个字)