MFC對檔案的高低位元組進行轉換
阿新 • • 發佈:2019-01-07
最近幫導師做一個專案,遇到了需要對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的函式來操作,大功告成啦