1. 程式人生 > >MFC對檔案的高低位元組進行轉換

MFC對檔案的高低位元組進行轉換

最近幫導師做一個專案,遇到了需要對TXT文件中的資料進行高低位元組轉換的問題,這裡首先放一下我們需要實現的效果,需要程式示例的請下載:高低位元組轉換Demo

原理其實非常簡單,主要是如下幾個步驟:

Step1:匯入檔案,並將檔案內容放入CString中儲存

Step2:去除檔案中位元組間的空格,形成一個連續的字串

Step3:對奇數(高|低)和偶數(低|高)位進行對調

Step4:對對調後的字串進行拼接並加上空格以方便檢視

Step5:對前後字串長度進行比對校驗

Step6:將新行程的字串寫入文字

具體的核心程式碼如下:

獲取寫檔案路徑:

void CMFCApplication6Dlg::OnBnClickedButton2()
{
	// TODO:  在此新增控制元件通知處理程式程式碼
	setlocale(LC_CTYPE, "chs");

	CFileDialog dlgFile(FALSE, _T("*.txt"), NULL, OFN_HIDEREADONLY, _T("Describe File(*.txt)|*.txt|All Files(*.*)|*.*||"), NULL);
	if (IDOK == dlgFile.DoModal())
	{
		FileName = dlgFile.GetPathName();
	}
	else
	{
		return;
	}
	SetDlgItemText(IDC_EDIT6, FileName);
}

讀檔案以及資料處理:

void CMFCApplication6Dlg::OnBnClickedButton1()
{
	CString strPath, strText = _T("");
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("txt記事本(*.txt)|*.txt|ini文件(*.ini)|*.ini|pem文件(*.pem)|*.pem||"), AfxGetMainWnd());

	if (IDOK == dlg.DoModal())
	{
		strPath = dlg.GetPathName();
		//顯示檔案的路徑
		SetDlgItemText(IDC_EDIT2, strPath);

		//獲取檔案長度
		string sPath = strPath.GetBuffer(strPath.GetLength() + 1);

		FILE* pFile = nullptr;        //pFile = fopen(sPath.c_str(), "r+t");
		fopen_s(&pFile, sPath.c_str(), "r");

		if (pFile)
		{
			fseek(pFile, 0, SEEK_END);
			int nFileLen = ftell(pFile);
			char* buf = new char[nFileLen+1];

			fseek(pFile, 0, SEEK_SET);
			fread(buf, sizeof(char), nFileLen, pFile);
			fclose(pFile);
			buf[nFileLen] = 0;;
			strText.Format(_T("%s"), buf);
			SetDlgItemText(IDC_EDIT4, strText);
			int length = strText.GetLength();
			CString length_show;
			length_show.Format("%d", length);
			SetDlgItemText(IDC_EDIT3, length_show);

			delete[] buf;
			//刪除掉檔案中的換行符和空格
			strText.Replace("\r\n", "");
			//刪除掉檔案中的空格
			strText.Replace(" ", "");
			
			
			CString show;
			CString result;
		   //字串的擷取和插值
			for (int i= 0; i < length/3; i=i+2)
			{
				CString temp;
				CString temp1;
				//字串擷取
				temp = strText.Mid(i*2,2);
				temp1 = strText.Mid(i*2+2, 2);
				show = temp1 +" "+ temp;
				result += show+" ";
			}
			
			//顯示處理後的字串
			result = result.Left((result.GetLength()-1));
			SetDlgItemText(IDC_EDIT1, result);

			int length1 = result.GetLength();
			CString length_show1;
			length_show1.Format("%d", length1);
			SetDlgItemText(IDC_EDIT7, length_show1);
			int len = 0;
			CString path = "";

			CFile file(FileName, CFile::modeReadWrite | CFile::modeCreate);
			file.Write(result, result.GetLength());
			len = file.GetLength();
			//file.Flush();
			file.Close();
			if (length==length1)
			{
				MessageBox("轉換成功,資料校驗正確","提示");
			}
			else
			{
				MessageBox("轉換成功,資料校驗異常,請檢查原始檔內容!","警告!");
			}

		}
	}
}

其實原理非常簡單,純使用CString的函式來操作,大功告成啦