#ifdef _UNICODE typedef std::wifstream t_ifs; typedef std::wofstream t_ofs; typedef std::wstring t_str; #else typedef std::ifstream t_ifs; typedef std::ofstream t_ofs; typedef std::string t_str; #endif bool SourceConv::ConvertFile(LPCTSTR szFileName) const { m_inner.Reset(); e_fileType type = GetFileType(szFileName); switch (type) { case typeAnsi: case typeUtf8: // utf-8也当ansi处理,目前好像没发现问题 return ConvertFileAnsi(szFileName); case typeUnicode: return ConvertFileUnicode(szFileName); default: _tprintf_s(_T("Invalid file format /'%s/'/n"), szFileName); return false; } } // ansi文本读写 bool SourceConv::ConvertFileAnsi(LPCTSTR szFileName) const { t_ifs ifs(szFileName); static const int c_sMaxLine = 1024 * 10; TCHAR szBuffer[c_sMaxLine]; ZeroMemory(szBuffer, c_sMaxLine * sizeof(TCHAR)); while (ifs.getline(szBuffer, c_sMaxLine, _T('/n'))) { t_str line(szBuffer); ProcessLine(line); // 得到line这一行,想干嘛干嘛 ZeroMemory(szBuffer, c_sMaxLine * sizeof(TCHAR)); } t_ofs ofs(szFileName); for (std::vector<t_str>::const_iterator cIter = m_inner.m_convFile.begin(); cIter != m_inner.m_convFile.end(); cIter++) { ofs << *cIter << _T("/n"); // *cIter指向一行文本,把它写到文件中 } ofs.close(); return true; } // unicode文本读写 bool SourceConv::ConvertFileUnicode(LPCTSTR szFileName) const { static const int c_snBufSize = 1024 * 1024; static const int c_snLine = 1024 * 10; static BYTE s_buffer[c_snBufSize]; // 一个大数组,用于存放文件数据。从性能考虑不考虑动态分配,但栈上不能分配太大数组,于是放到静态区域。 ZeroMemory(s_buffer, c_snBufSize * sizeof(BYTE)); FILE *fpIn = NULL; // 读:先读成BYTE数组,再手动解析: if (0 == _tfopen_s(&fpIn, szFileName, _T("rb"))) { fread(s_buffer, sizeof(BYTE), c_snBufSize, fpIn); fclose(fpIn); } LPCTSTR szText = (LPCTSTR)(s_buffer + 2); LPCTSTR pStart = szText; LPCTSTR pEnd = pStart; while (NULL != (pEnd = _tcschr(pStart, _T('/n')))) { pEnd++; TCHAR szLine[c_snLine]; ZeroMemory(szLine, c_snLine * sizeof(TCHAR)); _tcsncpy_s(szLine, c_snLine, pStart, pEnd - pStart); t_str line(szLine); ProcessLine(line); pStart = pEnd; } if (0 != _tcslen(pStart)) { // 不是以回车结尾的情形:处理最后一行 TCHAR szLine[c_snLine]; ZeroMemory(szLine, c_snLine * sizeof(TCHAR)); _tcscpy_s(szLine, c_snLine, pStart); t_str line(szLine); ProcessLine(line); } ZeroMemory(s_buffer, c_snBufSize * sizeof(BYTE)); s_buffer[0] = 0xff; s_buffer[1] = 0xfe; BYTE *pDst = &(s_buffer[2]); // 写:先写到BYTE数组里,再fwrite for (std::vector<t_str>::const_iterator cIter = m_inner.m_convFile.begin(); cIter != m_inner.m_convFile.end(); cIter++) { size_t sizeMem = cIter->length() * sizeof(TCHAR); memcpy(pDst, cIter->c_str(), sizeMem); pDst += sizeMem / sizeof(BYTE); } FILE *fpOut = NULL; if (0 == _tfopen_s(&fpOut, szFileName, _T("wb"))) { fwrite(s_buffer, sizeof(BYTE), pDst - s_buffer, fpOut); fclose(fpOut); } return true; }