文本文件转为二进制文件

源代码:

#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;
}

原文地址:http://blog.51cto.com/bocaihaoci/2068503

时间: 2024-10-15 16:00:58

文本文件转为二进制文件的相关文章

文本文件与二进制文件

关于文本文件和二进制文件,本文不打算做过深的探究,仅简单介绍二者的差别. 文本文件很常见,例如大家用记事本创建的文件,用C语言编辑器编写的代码文件,都属于文本文件. 二进制文件其实也比较常见,只是大家在用的时候并不知道用的是二进制文件,二进制文件最常见的便是图片,还有就是大家有时候见到的.bin拓展名的文件. 总体来说,计算机文件可以分为文本文件和二进制文件.二者各有优缺点,现罗列如下: 第一:空间利用率.文本文件将数字 1  当做字符  ' 1   来处理,在计算机中占用   8   个 位,

小小换行符乱谈(文本文件vs二进制文件)

使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含  "b" 使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含  "binary" 使用 python 的 open 打开文件,除了可以使用 C 中的 12 个模式外,还可以使用  "U" 或 "rU" 使用 Qt 库的 QFile 打开文件时,可以指定  QIODevice::Text

文本文件与二进制文件区别

计算机数据的存储在物理上都是二进制的,所以文本文件和二进制文件的区别并不是在于物理存储上. 主要在于编码方式上,文本文件是基于字符编码的文件常见编码有ascii,unicode,utf-8等,而二进制是基于值编码的文件 文本文件的定长编码(当前也有非定长如utf-8),二进制文件是边长编码,多少个bit代表一个值完全由你来决定,这样的编码方式导致二进制会更节省空间 如:00000000_00000000_00000000_00000001  用ascii编码方式在记事本中显示则为 NULL_NU

linux怎么区别文本文件和二进制文件

linux的文本文件与二进制文件的区分与windows的区分是相同的!说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为: (1).文本文件 文本文件是包含用户可读信息的文件.这些文件以ASCII码方式存储,可显示和打印.文本文件的行不能包括空字符(即码中的NULL),行的最大长度(包括换行符在内)也不能超过(LINE_MAX)所定义的字节数.不过文本文件中并不限制使用除空字符以外的控制字符或其它不可打印字符. (2).二进制文件(实际上这种说法不准确,因为文本文件也是用二进制

文本文件与二进制文件的定义

网上关于文本文件与二进制文件的文章很多,但遗憾的是,这些文章讲得都比较散.下面我将结合所查到的资料,从多个角度谈谈文本文件与二进制文件. 一.文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的.这两者只是在编码层次上有差异. 简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等.二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编

网络传输-文本文件和二进制文件的区别

1. 文本文件和二进制文件的定义 # 计算机在物理内存上面存放的都是二进制,所以文本文件和二进制文件的主要区别是在逻辑上的而不是物理上的.而从文件的编码方式来看,文件可以分为文本文件和二进制文件.文本文件是基于字符编码的文件,常见的有ASCII.Unicode等,二进制文件是基于值编码的文件,可以看成是变长编码,你可以根据自己的需要,决定多少个比特代表一个值. # 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种. # (1)ASCII文件也称为文本文件,这种文件在磁盘中存放时

文本文件和二进制文件的读写问题

因为工作的需要,需要读写自定义文件格式,要求以二进制方式进行读写,数据对用户来说是不可见的. 首先考虑用C++实现,代码如下: 1 std::ofstream fout("test.in", std::ios::binary|std::ios::out); 2 std::string str("Hello, world!"); 3 double nNum = 100.00; 4 fout.write((char*)nNum,sizeof(double)); 5 fo

文本文件和二进制文件的区别

从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种. ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码.例如,数5678的存储形式为:ASC码: 00110101 00110110 00110111 00111000 ↓ ↓   ↓    ↓十进制码: 5 6   7  8 共占用4个字节.ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容. 由于是按字符显示,因此能读

使用Preplot批量将ascii文件转为二进制文件

运行 -> cmd,输入: for /r . %i in (*.dat) do preplot %i 其中:for /r . %i in (*.dat)表示在当前目录下,查找dat扩展名的文件 命令的后半部分表示循环使用preplot处理. 使用时注意修改需要处理的目录.查找文件规则及preplot文件所在的路径 ------------------------------------------------------ 或者建立一个txt文件,修改为bat后缀,里面写入: for /r . %