写文件时字段对齐和填充的C代码实现

一、概述
在实际的软件开发项目中,经常会遇到需要转换某些文件中的字段格式的问题。例如,在生成的话单文件中,要求某些字段的长度固定,如果目前该字段的长度不足,则不足的位数用某些特殊的字符来填充(并可能会对填充的位置有要求)。之所以要求字段格式固定,是为了方便对文件的自动处理,因为很多软件是按照一定的规则对文件进行处理的。本文示例了对字段进行填充的方法。
本文要求生成文件中的字段长度固定为10,如果写入的内容长度小于10,不足部分可以用空格或0来填充。此外,要求程序可以控制在写入内容的左边或右边填充及填充的是0还是空格。

二、C代码实现

/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:TestAlign.c
* 文件标识:无
* 内容摘要:示例对文件内容对齐和填充的处理
* 其它说明:无
* 当前版本:V1.0
* 作   者:Zhou Zhaoxiong
* 完成日期:20150901
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 重定义数据类型
typedef signed   int  INT32;
typedef signed   char INT8;

// 函数声明
void WriteFile(INT32 iAlignFlag, INT8 *pszTestStr);
INT32 main();

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号            修改人            修改内容
* -------------------------------------------------------------------
* 20150901        V1.0           Zhou Zhaoxiong        创建
***********************************************************************/
INT32 main()
{
    INT32 iAlignFlag   = 0;
    INT8 szTestStr[50] = {0}; 

    printf("请输入对齐方式(1, 2, 3, 4)和测试字符串\n");

    scanf("AlignFlag=%d, TestStr=%s", &iAlignFlag, szTestStr);

    printf("输入信息: 对齐方式%d, 测试字符串%s\n", iAlignFlag, szTestStr);

    WriteFile(iAlignFlag, szTestStr);   // 调用写文件函数

    return 0;                 // main函数执行成功返回0
}


/**********************************************************************
* 功能描述:根据对齐方式写文件
* 输入参数:iAlignFlag-对齐方式
            pszTestStr-测试字符串
* 输出参数:无
* 返 回 值:无
* 其它说明:设基准长度为10个字节, 未达到则补空格或0
* 修改日期      版本号            修改人            修改内容
* -------------------------------------------------------------------
* 20150901      V1.0          Zhou Zhaoxiong       创建
***********************************************************************/
void WriteFile(INT32 iAlignFlag, INT8 *pszTestStr)
{
    FILE *fp             = NULL;
    INT8 szContent[50]   = {0};
    INT8 szFileName[50]  = {0};

    if (pszTestStr == NULL)   // 判断输入参数是否为空
    {
        printf("WriteFile: input parameter(s) is NULL!");
        return;
    }

    if (iAlignFlag == 1)     // 左对齐, 不足的位补空格
    {
        _snprintf(szContent, sizeof(szContent)-1, "%10s", pszTestStr);
    }

    if (iAlignFlag == 2)     // 右对齐, 不足的位补空格
    {
        _snprintf(szContent, sizeof(szContent)-1, "%-10s", pszTestStr);
    }

    if (iAlignFlag == 3)     // 左对齐, 不足的位补0
    {
        _snprintf(szContent, sizeof(szContent)-1, "%-s%0*d", pszTestStr, 10-strlen(pszTestStr), 0);
    }

    if (iAlignFlag == 4)     // 右对齐, 不足的位补0
    {
        _snprintf(szContent, sizeof(szContent)-1, "%0*d%s", 10-strlen(pszTestStr), 0, pszTestStr);
    }

    // 将文件内容写入
    strcpy(szFileName, "D:\\Test\\TestFile.txt"); // 注意: 文件目录是双\, 不要写成"D:\Test\TestFile.txt"
    fp = fopen(szFileName, "w");
    if (fp != NULL)
    {
        fputs(szContent, fp);
        fclose(fp);
        fp = NULL;
        printf("WriteFile: Write %s into file successfully!\n", szContent);
    }
    else
    {
        printf("WriteFile: Write %s into file failed!\n", szContent);
    }
}

三、程序说明
1.本程序用iAlignFlag来表示填充方式,具体如下:
(1) 如果iAlignFlag为1,则表示在写入内容的右边填充空格(即内容左对齐, 不足的位补空格)。
(2) 如果iAlignFlag为2,则表示在写入内容的左边填充空格(即内容右对齐, 不足的位补空格)。
(3) 如果iAlignFlag为3,则表示在写入内容的右边填充0(即内容左对齐, 不足的位补0)。
(4) 如果iAlignFlag为4,则表示在写入内容的左边填充0(即内容右对齐, 不足的位补0)。
2.大家要特别注意本程序中在左边或右边填充0或空格的方法,具体如下:
(1) 左对齐,右补空格:
_snprintf(szContent, sizeof(szContent)-1, “%10s“, pszTestStr);
(2) 右对齐,左补空格:
_snprintf(szContent, sizeof(szContent)-1, “%-10s“, pszTestStr);
(3) 左对齐,右补0:
_snprintf(szContent, sizeof(szContent)-1, “%-s%0*d“, pszTestStr, 10-strlen(pszTestStr), 0);
(4) 右对齐,左补0:
_snprintf(szContent, sizeof(szContent)-1, “%0*d%s“, 10-strlen(pszTestStr), 0, pszTestStr);

四、程序输出
程序输出的截图如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
同时,查看“D:\Test”下的“TestFile.txt”文件内容,可以看到写入内容是正确的。

五、总结
本程序代码虽然不多,也不复杂,但大家要特别注意对于对齐和字符填充的处理方法。如果让大家从头开始编写程序,也不是那么容易找到正确的处理方法的。这也说明了很多问题看似简单,但要完美地解决它,还需要我们具备扎实的功底,也还需要我们多多实践。


欢迎大家关注并支持本人新书《C程序员从校园到职场》。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值