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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 01-01

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

使用 Java 程序写文件时,记得要 flush()

使用 Java 程序往磁盘写文件时碰到了这样的问题:文件写不全. 假如内容(StringBuffer/StringBuilder)有 100W 个字符,但是通过 Java 程序写到文件里的却不到 100W ,部分字符不见了. 代码大致是这样的: 1 private void writeToDisk() throws Exception { 2 File file = new File("FILE_PATH"); 3 OutputStreamWriter osw = null; 4 os

java写文件时,输出不完整的原因以及解决方法close()或flush()

在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")); 用到这个的时候一定不能忘了他的伴侣代码.. bw.close(); 或者 bw.flush(); 实际上,FileWriter在写文件时,会把内容存储到一块缓冲区中,当缓冲区满后,才会把缓冲区中的内容写入文件,内容再继续存到缓冲区,如此反复,而flush()会将内存中的内容强制写到文件中,即使内存没满.这

Linux下MySQL的写文件时权限错误(Errcode: 13)解决方法

在数据库中select * into outfile '/home/mysql/data.sql',mysql又提示错误: ERROR 1 (HY000): Can't create/write to file '/home/mysql/data.sql' (Errcode: 13)   权限错误(Errcode: 13)解决方法 1  查看导出目录的权限 是否有mysql用户写的权限 2 如果有多级目录,要确保到处目录的上级目录有可执行权限,如果是/root目录 700要修改705 否则写不进

python写文件时,使用代码强制刷新文件

一.实验环境 1.Windows10x64 2.anaconda4.6.9 + python3.7.1(anaconda集成,不需单独安装) 3.pyinstaller3.5 二.任务需求 三.问题描述 1.文件1中内容,添加至总文件后,被后续的文件2覆盖! 2.文件1添加至总文件后,添加一行打印语句(打印语句执行需要时间),未被后续文件2覆盖! 四.问题分析 怀疑python写入文件,Windows操作系统未及时刷新,未执行真正的写动作,存在短暂延时,需要使用文件刷新函数. 五.文件刷新 1.

select into outfile写文件时路径包含中文解决办法

set character_set_client='gbk';set character_set_connection='gbk';set character_set_database='gbk';set character_set_results='gbk';set character_set_server='gbk';select '2' into outfile 'c:\\是\\22b.txt'; 应该不少人会遇到这种问题,最后写出来的文件名乱码.其实只要把中文用URL编码(GBK)就好,

[stm32][FATFS]正在写文件时掉电,导致文件系统错误

阅读官网文档:http://elm-chan.org/fsw/ff/doc/sync.html Case 1. Normal write sequence Time --> ↓Normal shutdown OwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwC <Power off> Case 2. Without using f_sync() Time --> ↓System c

C#写UTF8文件时指定是否含BOM头

BOM的基本概念 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE".这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的:如果收到FFFE,就表明这个字节流是Little-Endian的.因此字符"ZERO WIDTH N

Dom4j读写文件时的编码问题

1.Dom4j写文件时的编码问题 如上图代码所示,如果使用 writer = new XMLWriter(new FileWriter(new File(filepath)), xmlFormat); 下载的xml文件编码格式如下: 原因分析: 由于FileWriter默认的输出编码是ANSI编码,而Dom4j中的wirte方法提供的内容实际是以UTF-8保存的,因此会造成包括中文字符的XML文件无法正常阅读. 解决方法: 不能使用简单的FileWriter,而应该是使用一个能指定具体输出编码的

Python只有文件不存在才能写文件

当我们在Python里面写文件时,我们常用的模式为 w模式,这种模式下,如果文件不存在,就会生成文件:如果文件已经存在,就会直接覆盖. 有时候,如果文件已经存在,直接覆盖文件可能会导致重要数据丢失.你不希望再覆盖文件,那么你可能会这样写代码: import os if os.path.exists('/test/file.txt'): print('文件已经存在') else: with open('/test/file.txt', 'w', encoding='utf-8') as f: f.