文本文件轉為二進制文件
阿新 • • 發佈:2018-02-03
|| true sig bin wro nal tde sign ret 源代碼:
#include <stdio.h> #include <stdlib.h> #define SUCCESS 0 #define FAILURE 1 #define IN #define OUT #define INOUT typedef unsigned long BOOL_T; typedef unsigned char UCHAR; typedef unsigned long ULONG; #define BOOL_TRUE (BOOL_T)1 #define BOOL_FALSE (BOOL_T)0 static inline FILE* fopen_s(IN const char *fname, IN const char *mode) { FILE *pcFile = NULL; if (NULL == fname || NULL == mode) { fprintf(stderr, "line:%d,wrong param [fname or mode = NULL]\n", __LINE__); return NULL; } pcFile = fopen(fname, mode); if (NULL == pcFile) { fprintf(stderr, "line:%d,fopen() failed", __LINE__); return NULL; } return pcFile; } ULONG hex2Dec(IN UCHAR aucHex[], OUT UCHAR *pucDec) { ULONG i = 0; ULONG weight = 0; BOOL_T bflag = BOOL_TRUE; if (NULL == pucDec) { fprintf(stderr, "line:%d,wrong param [pucDec = NULL]\n", __LINE__); return FAILURE; } *pucDec = 0; for (i = 0; i < 2; ++i) { weight = bflag ? 16 : 1; if (‘a‘ <= aucHex[i] && ‘f‘ >= aucHex[i]) { *pucDec += (UCHAR)((aucHex[i] - ‘a‘ + 10) * weight); } else if (‘0‘ <= aucHex[i] && ‘9‘ >= aucHex[i]) { *pucDec += (UCHAR)((aucHex[i] - ‘0‘) * weight); } else { return FAILURE; } bflag = BOOL_FALSE; } return SUCCESS; } ULONG removeSpInFile(IN const char *pcFilePath) { FILE *pcOriginalFile = NULL; FILE *pcTmpFile = NULL; int ich = 0; int iRet = 0; if (NULL == pcFilePath) { fprintf(stderr, "line:%d,wrong param [pcFilePath = NULL]\n", __LINE__); return FAILURE; } pcOriginalFile = fopen_s(pcFilePath, "r"); //創建臨時文件 pcTmpFile = tmpfile(); if (NULL == pcTmpFile) { fprintf(stderr, "line:%d,tmpfile() failed\n", __LINE__); fclose(pcOriginalFile); return FAILURE; } while (EOF != (ich = fgetc(pcOriginalFile))) { if (‘ ‘ == ich || ‘\n‘ == ich) { continue; } fputc(ich, pcTmpFile); } fclose(pcOriginalFile); iRet = remove(pcFilePath); if (SUCCESS != iRet) { fprintf(stderr, "line:%d,remove() failed\n", __LINE__); fclose(pcTmpFile); return FAILURE; } pcOriginalFile = fopen_s(pcFilePath, "w"); rewind(pcTmpFile); while (EOF != (ich = fgetc(pcTmpFile))) { fputc(ich, pcOriginalFile); } fclose(pcOriginalFile); fclose(pcTmpFile); return SUCCESS; } ULONG txt2bin(IN const char *pcFilePath) { FILE *pcOriginalFile = NULL; FILE *pcTmpFile = NULL; ULONG ulRet = SUCCESS; UCHAR aucHex[2] = {0}; UCHAR ucDec = 0; int ich = 0; ulRet = removeSpInFile(pcFilePath); if (SUCCESS != ulRet) { fprintf(stderr, "line:%d,removeSpInFile() failed\n", __LINE__); return FAILURE; } pcOriginalFile = fopen_s(pcFilePath, "rb"); //創建臨時文件 pcTmpFile = tmpfile(); if (NULL == pcTmpFile) { fprintf(stderr, "line:%d,tmpfile() failed\n", __LINE__); fclose(pcOriginalFile); return FAILURE; } while (EOF != fscanf(pcOriginalFile, "%c%c", &aucHex[0], &aucHex[1])) { ulRet = hex2Dec(aucHex, &ucDec); if (SUCCESS != ulRet) { fprintf(stderr, "line:%d,hexToDec() failed\n", __LINE__); return FAILURE; } fputc(ucDec, pcTmpFile); } fclose(pcOriginalFile); ulRet = (ULONG)remove(pcFilePath); if (SUCCESS != ulRet) { fprintf(stderr, "line:%d,remove() failed\n", __LINE__); fclose(pcTmpFile); return FAILURE; } pcOriginalFile = fopen_s(pcFilePath, "wb"); rewind(pcTmpFile); while (EOF != (ich = fgetc(pcTmpFile))) { fputc(ich, pcOriginalFile); } fclose(pcOriginalFile); fclose(pcTmpFile); return SUCCESS; } int main(int argc, char *argv[]) { ULONG ulRet = 0; if (2 != argc) { fprintf(stderr, "Usage %s <fname>\n", argv[1]); return FAILURE; } ulRet = txt2bin(argv[1]); if (SUCCESS != ulRet) { fprintf(stderr, "line:%d,txt2bin() failed\n", __LINE__); return FAILURE; } return SUCCESS; }
文本文件轉為二進制文件