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

时间:2021-06-18 10:03:29

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

四、程序输出
程序输出的截图如下:
写文件时字段对齐和填充的C代码实现
写文件时字段对齐和填充的C代码实现
写文件时字段对齐和填充的C代码实现
写文件时字段对齐和填充的C代码实现
同时,查看“D:\Test”下的“TestFile.txt”文件内容,可以看到写入内容是正确的。

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


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