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

来源:互联网 发布:微博的营销模式知乎 编辑:程序博客网 时间:2024/05/02 02:07

一、概述
在实际的软件开发项目中,经常会遇到需要转换某些文件中的字段格式的问题。例如,在生成的话单文件中,要求某些字段的长度固定,如果目前该字段的长度不足,则不足的位数用某些特殊的字符来填充(并可能会对填充的位置有要求)。之所以要求字段格式固定,是为了方便对文件的自动处理,因为很多软件是按照一定的规则对文件进行处理的。本文示例了对字段进行填充的方法。
本文要求生成文件中的字段长度固定为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程序员从校园到职场》。

1 0
原创粉丝点击