1. 程式人生 > >UNICODE環境下讀寫txt文件操作

UNICODE環境下讀寫txt文件操作

clas c程序 delete tag 編碼 eno 字符編碼 empty readline

內容轉載自http://blog.sina.com.cn/s/blog_5d2bad130100t0x9.html

UNICODE環境下讀寫txt文件操作

(2011-07-26 17:40:05)
標簽:

雜談

分類: MFC程序設計
自己動手整理了一下,寫了幾個函數,用於UNICODE環境下對txt文本文件的操作,針對txt文本的ANSIC編碼格式,進行了字符編碼格式的轉換。
******************************************************************************
函 數 名 稱:BOOL FileWriteline(CString &filename,CStringW &msg)
函 數 功 能:向文件filename末尾寫入一行指定的內容(CStringW)
函 數 參 數:filename為所要寫入的文件,msg為所要寫入的內容
返 回 值:函數成功,返回TRUE,失敗返回FALSE
*******************************************************************************
BOOL FileWriteline(CString &filename,CStringW &msg)
{
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
return FALSE;
m_TextFile.SeekToEnd();
int ansiCount=WideCharToMultiByte(CP_ACP,0,msg,-1,NULL,0,NULL,NULL);
char * pTempChar=(char*)malloc(ansiCount*sizeof(char));//申請空間
memset(pTempChar,0,ansiCount);
WideCharToMultiByte(CP_ACP,0,msg,-1,pTempChar,ansiCount,NULL,NULL);//轉換字符
m_TextFile.Write(pTempChar,strlen(pTempChar));
m_TextFile.Write("\n",1);
free(pTempChar);
m_TextFile.Close();
return TRUE;
}

******************************************************************************
函 數 名 稱:CStringW FileReadline(CString &filename,int index)
函 數 功 能:從文件filename中讀取指定行index的內容
函 數 參 數:filename為所要讀取的文件,index為指定行數,從0開始
返 回 值:函數成功,返回讀取的一行內容(CStringW),文件打開失敗或文件內容
為空或是指定行數超過文件內容本身的行數,返回內容為空,
*******************************************************************************
CStringW FileReadline(CString &filename,int index)
{
CStringW rt;
int zline=file_nline(filename);
if(index>zline-1)
{
rt=_T("");
return rt;
}
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
{
rt=_T("");
return rt;
}
int nline=0;
int i=0;
char a[1];
char *b;
b = new char[500];
while(m_TextFile.Read(a,1) && zline!=0)
{
if(nline==index && a[0]!=‘\n‘)
{
b[i]=a[0];
i++;
}
if(a[0]==‘\n‘)
{
zline--;
if(nline==index)
{
b[i]=‘\0‘;
break;
}
else
nline++;
}
}
int unicodeLen = MultiByteToWideChar( CP_ACP,0,b,-1,NULL,0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar( CP_ACP,0,b,-1,(LPWSTR)pUnicode,unicodeLen );
rt = ( wchar_t* )pUnicode;
m_TextFile.Close();
delete pUnicode;
delete b;
return rt;
}

******************************************************************************
函 數 名 稱:int file_nline(CString &filename)
函 數 功 能:獲取文件filename內容的行數
函 數 參 數:filename為所要寫入的文件,msg為所要寫入的內容
返 回 值:函數成功,返回filename的行數,失敗或文件內容為空返回0
*******************************************************************************
int file_nline(CString &filename)
{
char a[1];
int nline=0;
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
{
return nline;
}
while(m_TextFile.Read(a,1)!=0)
{
if(a[0]==‘\n‘)
nline++;
}
m_TextFile.Close();
return nline;
}

******************************************************************************
函 數 名 稱:BOOL FileModifyline(CString &filename,int index,CStringW &msg)
函 數 功 能:獲取文件filename第index行的內容為msg
函 數 參 數:filename為要修改的文件,index(從0開始)為行數,msg為要修改後的內容
返 回 值:函數成功,返回TRUE,失敗返回FALSE
*******************************************************************************
BOOL FileModifyline(CString &filename,int index,CStringW &msg)
{
int k,nline;
nline=file_nline(filename);
if(index>nline-1)
return FALSE;
CStringW tempmsg;
CString tempfile(_T("temp.txt"));
for(k=0;k<nline;k++)
{
tempmsg=FileReadline(filename,k);
if(tempmsg.IsEmpty())
return FALSE;
if(k==index)
{
if(FileWriteline(tempfile,msg)==FALSE)
return FALSE;
}
else
{
if(FileWriteline(tempfile,tempmsg)==FALSE)
return FALSE;
}
}
CStdioFile modify;
modify.Remove(filename);
modify.Rename(tempfile,filename);
return TRUE;
}

UNICODE環境下讀寫txt文件操作