一、概述
在實際的軟件開發項目中,經常會遇到需要轉換某些文件中的字段格式的問題。例如,在生成的話單文件中,要求某些字段的長度固定,如果目前該字段的長度不足,則不足的位數用某些特殊的字符來填充(並可能會對填充的位置有要求)。之所以要求字段格式固定,是為了方便對文件的自動處理,因為很多軟件是按照一定的規則對文件進行處理的。本文示例了對字段進行填充的方法。
本文要求生成文件中的字段長度固定為10,如果寫入的內容長度小於10,不足部分可以用空格或0來填充。此外,要求程序可以控制在寫入內容的左邊或右邊填充及填充的是0還是空格。
二、C代碼實現
/**********************************************************************
* 版權所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名稱:TestAlign.c
* 文件標識:無
* 內容摘要:示例對文件內容對齊和填充的處理
* 其它說明:無
* 當前版本:V1.0
* 作 者:Zhou Zhaoxiong
* 完成日期:20150901
*
**********************************************************************/
#include
#include
#include
// 重定義數據類型
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)和測試字符串
);
scanf(AlignFlag=%d, TestStr=%s, &iAlignFlag, szTestStr);
printf(輸入信息: 對齊方式%d, 測試字符串%s
, 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:TestTestFile.txt
fp = fopen(szFileName, w);
if (fp != NULL)
{
fputs(szContent, fp);
fclose(fp);
fp = NULL;
printf(WriteFile: Write %s into file successfully!
, szContent);
}
else
{
printf(WriteFile: Write %s into file failed!
, 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”文件內容,可以看到寫入內容是正確的。
五、總結
本程序代碼雖然不多,也不復雜,但大家要特別注意對於對齊和字符填充的處理方法。如果讓大家從頭開始編寫程序,也不是那麼容易找到正確的處理方法的。這也說明了很多問題看似簡單,但要完美地解決它,還需要我們具備扎實的功底,也還需要我們多多實踐。