zoukankan      html  css  js  c++  java
  • UNICODE环境下读写txt文件操作

    内容转载自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(" ",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]!=' ')
            {
                b[i]=a[0];
                i++;
            }
            if(a[0]==' ')
            {
                zline--;
                if(nline==index)
                {
                    b[i]='';
                    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]==' ')
                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;
    }
  • 相关阅读:
    poj2240
    poj1135
    poj1062
    poj3278
    2218 补丁vs错误
    必做: 1041、1024、1077、2218、1183(较难)
    poj2828
    poj3253
    洛谷P1122 最大子树和
    1074 食物链
  • 原文地址:https://www.cnblogs.com/qiangge-blog/p/7280148.html
Copyright © 2011-2022 走看看