写文件时字段对齐和填充的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程序员从校园到职场》。

目录
相关文章
|
14天前
如何设置条件格式以填充颜色?
【10月更文挑战第21天】如何设置条件格式以填充颜色?
29 2
|
13天前
表格数据填充方法单元格数据填充
表格数据填充方法单元格数据填充【10月更文挑战第22天】
21 2
|
13天前
表格数据填充方法
【10月更文挑战第22天】表格数据填充方法
20 2
|
14天前
|
存储 NoSQL 编译器
如何检查结构体的对齐情况
在C/C++中,结构体的对齐情况会影响内存布局和访问效率。可以通过以下方法检查结构体的对齐情况:1. 使用 `sizeof` 操作符获取结构体大小;2. 使用 ` offsetof` 宏获取成员偏移量;3. 编译器提供的对齐属性或指令。
|
2月前
单元格内容的对齐方式
单元格内容的对齐方式
31 1
|
6月前
|
C++
限定宽度(补充)
该内容介绍了一个关于小数显示宽度限定符的示例。在C++代码中,`printf(&quot;%5d&quot;, 123.45)` 输出结果为 `123.45`, 其中数字前有2个空格,后有4个空格。这是因为默认小数精度为6位,所以123.45后有4个空格,而`%5d`指定至少占用5位,导致前面出现2个空格。
32 1
|
6月前
|
容器
微搭低代码实现下拉框动态填充值
微搭低代码实现下拉框动态填充值
|
C语言 C++
C/C++格式化输入与输出(位宽,左右对齐,%d,%f等)总结
C/C++格式化输入与输出(位宽,左右对齐,%d,%f等)总结
1547 0
03:对齐输出
03:对齐输出
118 0
结构体类型对齐问题----例题及方法详细解析
结构体类型对齐问题----例题及方法详细解析
77 0