例:
运行:./CSTRING test.txt
其中,test.txt文件内容为:
30:31:32
则得到的"Cstring.txt"输入文件中
012
本程序能自动跳过0或多个分隔符(分隔符可以为任意的符号,如“:”,“%”或空格等,判断的函数实现见SkipDelimiter函数)。
如:输入文件内容为:
30 31 32
或
303132
得到的都是
012
[cpp] view plain copy
1.#include 2.#include 3.#include 4.#include 5.#include 6.#include 7.#include 8.#include 9. 10.typedef unsigned char uint8; 11. 12.uint8 ConverseOneChar(uint8 ucChar) 13.{ 14. uint8 ucTmp = 0x00; 15. printf("one ucChar= 0x%x\\n", (char)ucChar); 16. switch(ucChar) 17. { 18. case '0': 19. ucTmp = 0x00; 20. break; 21. case '1': 22. ucTmp = 0x01; 23. break; 24. case '2': 25. ucTmp = 0x02; 26. break; 27. case '3': 28. ucTmp = 0x03; 29. break; 30. case '4': 31. ucTmp = 0x04; 32. break; 33. case '5': 34. ucTmp = 0x05; 35. break; 36. case '6': 37. ucTmp = 0x06; 38. break; 39. case '7': 40. ucTmp = 0x07; 41. break; 42. case '8': 43. ucTmp = 0x08; 44. break; 45. case '9': 46. ucTmp = 0x09; 47. break; 48. case 'a': 49. case 'A': 50. ucTmp = 0x0a; 51. break; 52. case 'b': 53. case 'B': 54. ucTmp = 0x0b; 55. break; 56. case 'c': 57. case 'C': 58. ucTmp = 0x0c; 59. break; 60. case 'd': 61. case 'D': 62. ucTmp = 0x0d; 63. break; . case 'e': 65. case 'E': 66. ucTmp = 0x0e; 67. break; 68. case 'f': 69. case 'F': 70. ucTmp = 0x0f; 71. break; 72. default: 73. printf("err char!\\n"); 74. return -1; 75. } 76. return ucTmp; 77.} 78. 79.uint8 GetOneChar(uint8 *pucBuf) 80.{ 81. uint8 ucChar = 0x00; 82. if(NULL == pucBuf) 83. { 84. printf("para is NULL!\\n"); 85. return -1; 86. } 87. 88. ucChar = ConverseOneChar(pucBuf[0]); . printf("first ucChar= 0x%x\\n", (char)ucChar); 90. ucChar <<= 4; 91. ucChar |= ConverseOneChar(pucBuf[1]); 92. printf("second ucChar= %c[0x%x]\\n", (char)ucChar, ucChar); 93. 94. return ucChar; 95.} 96. 97.int SkipDelimiter(uint8 *pcBuf) 98.{ 99. int n = 0; 100. char *pcBufTmp = (char *)pcBuf; 101. 102. for(n = 0; (pcBufTmp[n] != '\\0') && (pcBufTmp[n] != '\\n') && (pcBufTmp[n] != '\\r'); n++) 103. { 104. if ((pcBufTmp[n] == '0') 105. || (pcBufTmp[n] == '1') 106. || (pcBufTmp[n] == '2') 107. || (pcBufTmp[n] == '3') 108. || (pcBufTmp[n] == '4') 109. || (pcBufTmp[n] == '5') 110. || (pcBufTmp[n] == '6') 111. || (pcBufTmp[n] == '7') 112. || (pcBufTmp[n] == '8') 113. || (pcBufTmp[n] == '9') 114. || (pcBufTmp[n] == 'A') || (pcBufTmp[n] == 'a') 115. || (pcBufTmp[n] == 'B') || (pcBufTmp[n] == 'b') 116. || (pcBufTmp[n] == 'C') || (pcBufTmp[n] == 'c') 117. || (pcBufTmp[n] == 'D') || (pcBufTmp[n] == 'd') 118. || (pcBufTmp[n] == 'E') || (pcBufTmp[n] == 'e') 119. || (pcBufTmp[n] == 'F') || (pcBufTmp[n] == 'f')) 120. { 121. break; 122. } 123. } 124. 125. return n; 126.} 127. 128.int ParseHexString(unsigned char *pucSrcBuf, int iSrcFileLen, unsigned char *pucDstBuf) 129.{ 130. uint8 *pucSrcTmp = NULL; 131. uint8 *pucDstTmp = NULL; 132. uint8 ucTmp = 0; 133. int iFileLenRemain = iSrcFileLen; 134. int iDelimiterNum = 0; 135. int n = 0; 136. 137. if((NULL == pucSrcBuf)||(NULL == pucSrcBuf)) 138. { 139. printf("para 1 or 2 is NULL!\\n"); 140. return -1; 141. } 142. pucSrcTmp = pucSrcBuf; 143. pucDstTmp = pucDstBuf; 144. 145. 146. while(iFileLenRemain != 0) 147. { 148. ucTmp = GetOneChar(pucSrcTmp); 149. printf("ucTmp = %c\\n", (char)ucTmp); 150. pucDstTmp[n++] = ucTmp; 151. 152. pucSrcTmp += 2; 153. iDelimiterNum = SkipDelimiter(pucSrcTmp); 154. printf("iDelimiterNum=%d\\n", iDelimiterNum); 155. pucSrcTmp += iDelimiterNum; 156. iFileLenRemain -= 2 + iDelimiterNum; 157. } 158. 159. return n; 160.} 161. 162.int main(int argc, char **argv) 163.{ 1. int iRet = 0; 165. char *pcFileForChange = NULL; 166. int iSrcFd = 0; 167. int iDstFd = 0; 168. int iSrcFileLen = 0; 169. int n = 0; 170. unsigned char *pucSrcBuf = NULL; 171. unsigned char *pucDstBuf = NULL; 172. 173. if(argc != 2) 174. { 175. printf("you need input the filename to change!\\n"); 176. return -1; 177. } 178. 179. pcFileForChange = argv[1]; 180. printf("filename:%s\\n", pcFileForChange); 181. iSrcFd = open(pcFileForChange, O_RDONLY); 182. if (iSrcFd < 0) 183. { 184. printf("open file:[%s] faild!\\n", pcFileForChange); 185. return -1; 186. } 187. iDstFd = open("Cstring.txt", O_RDWR | O_CREAT | O_TRUNC, 04); 188. if (iDstFd < 0) 1. { 190. printf("open change filename file faild!\\n"); 191. return -1; 192. } 193. 194. iSrcFileLen = lseek(iSrcFd, 0, SEEK_END); 195. printf("FileLen:%d\\n", iSrcFileLen); 196. lseek(iSrcFd, 0, SEEK_SET); 197. pucSrcBuf = malloc(iSrcFileLen + 1024); 198. pucDstBuf = malloc(iSrcFileLen); 199. memset(pucSrcBuf, 0, iSrcFileLen); 200. memset(pucDstBuf, 0, iSrcFileLen); 201. 202. iRet = read(iSrcFd, pucSrcBuf, iSrcFileLen); 203. if(iRet != iSrcFileLen) 204. { 205. printf("read err, read len = %d\\n", iRet); 206. return -1; 207. } 208. printf("read:%s\\n", pucSrcBuf); 209. 210. n = ParseHexString(pucSrcBuf, iSrcFileLen, pucDstBuf); 211. printf("write:\\n%s\\n", pucDstBuf); 212. 213. iRet = write(iDstFd, pucDstBuf, n); 214. if(iRet != n) 215. { 216. printf("write err, write len = %d\\n", iRet); 217. return -1; 218. } 219. 220. close(iSrcFd); 221. close(iDstFd); 222. 223. 224. return 0; 225.} 下载本文