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

时间: 2024-10-04 09:53:17

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

groovy template-Groovy使用template写文件时,如何写入list

问题描述 Groovy使用template写文件时,如何写入list groovy的代码如下: TemplateEngine engine = new SimpleTemplateEngine() Template template1 = engine.createTemplate(param.getGroovyTemplate()) Writable writable = template1.make(map) new File("f:/foo.txt").write(writabl

DataOutputStream 在写文件时,写不进去

问题描述 在做android上的一个应用,用DataOutputStream写一个文件, 在pc机上运行程序是可以写入的,但是在android虚拟机上就是写不进去,在网上搜了一篇文章说是http请求的话就写不进去,不知道什么原因http://blog.163.com/fenglanghai@126/blog/static/3356877920105405586/有谁知道啊,说说 解决方案 在AndroidManifest.xml中加上权限部分, <uses-permission android:

Java编程那些事儿88——文件操作之写文件

11.3.1.4 写文件 如前所述,将程序内部的数据输出到程序外部的数据源,应该使用IO类体系中的输出流.在实际的编程中,将程序中的数据,例如用户设定或程序运行时生成的内容,存储到外部的文件中,应该使用输出流进行编程. 基本的输出流包含OutputStream和Writer两个,区别是OutputStream体系中的类(也就是OutputStream的子类)是按照字节写入的,而Writer体系中的类(也就是Writer的子类)是按照字符写入的. 使用输出流进行编程的步骤是: 1.建立输出流 建立

php中写文件函数实例程序

方法一,利用fopen与fwirte函数实现 1,PHP如何打开文件 使用PHP函数fopen()打开一个文件,fopen()一般使用2个参数表示打开文件的路径和文件模式.比如:  代码如下 复制代码 $fp=fopen("../cnbruce.txt",'w');   其中 "../cnbruce.txt" 就表示打开的cnbruce.txt文件的路径(相对当前执行程序文件的路径),'w'表示以只写的方式打开该文本文件. 写文件用 fwrite(file,stri

非传统扫描-获取 IO写完成时-&amp;amp;#39;信号&amp;amp;#39;, 定位更新文件, 技术交流~

问题描述 获取 IO写完成时-'信号', 定位更新文件, 技术交流~ 大家好, 请问有研究过获取 IO写操作完成时, 即close关闭文件的那一触发信号 及 定位该文件具体? 其目的: 能快速 实时的知道 具体哪个文件进行了更新~(而非其它传统做法的, 扫描比较~) 我正想对 fclose 进行修改, 其中加点触发代码~ 发点类似广播什么的~ 重新编译并替换原库. 这样改被动为 主动~ 那些有更新的文件, 主动过来告诉我 说, "我更新了, 赶紧扫描我吧~" 不知各位 有了解/接触 过

vs2013 c-vs2013写c时 提示无法启动程序之后是我的路径名 系统无法找到指定文件

问题描述 vs2013写c时 提示无法启动程序之后是我的路径名 系统无法找到指定文件 在我的路径下确实没有找到.exe的文件,重装了一遍还是同样的问题

csv文件导入到数据库时字段中的分隔符怎么屏蔽

问题描述 csv文件导入到数据库时字段中的分隔符怎么屏蔽 csv文件导入到数据库过程中,字段中有分隔符的情况应该怎么处理呢?维基百科上说应该用双引号包裹,但这样并没有效果.我用的是sql server2012,请大神指教.

write-OpenCV写yaml文件时的问题

问题描述 OpenCV写yaml文件时的问题 我想在config.yaml中写入 AAA: - BBB: a: 1 b: 2 我写的代码如下: #include ""opencv2/opencv.hpp""using namespace cv;int main(int char** argv){ FileStorage fw(""./config.yaml"" FileStorage::WRITE); fw <<

verilog ram fpga-verilog写顶层文件时出现错以下错误,该如何解决呢?

问题描述 verilog写顶层文件时出现错以下错误,该如何解决呢? 错误如下:Error (10839): Verilog HDL error at TEST.v(26): using implicit port connections is a SystemVerilog feature代码如下:module TEST( phase_a phase_b dq); input phase_a;input phase_b;inout [15:0] dq; DECODER( .reset(reset