for (int i = 0; i < nItem; i++)
{
/*fileData += m_CDialogChange.m_Question_buff.GetAt(i);
fileData += enter;
fileData += m_CDialogChange.m_Reply_buff.GetAt(i);
fileData += enter;*/ fileData += m_CDialogChange.m_Question_buff.GetAt(i);
fileData += _T("\n");
fileData += m_CDialogChange.m_Reply_buff.GetAt(i);
fileData += _T("\n");;
}
//temp = fileData;
BYTE bom[2] = {0xff, 0xfe};
file.Write(bom,sizeof(bom));
file.Write(fileData,fileData.GetLength());
file.Close();我这样写的,写进去后打开txt文件看到换行的位置有乱码  如:请输入问题਍ഀ
请输入回复਍ഀ
请输入问题਍ഀ
请输入回复਍ഀ
请输入问题਍ഀ
请问换行应该怎么写?

解决方案 »

  1.   

    try
    {
    CFile file(_T("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
    CString strText(_T("Hello, World!"));
    strText += _T("\r\n");
    strText += _T("你好,世界!");
    strText += _T("\r\n");
    strText += _T("ABC");#ifndef _UNICODE
    wchar_t* pBuf = NULL;
    int nLen = MultiByteToWideChar(CP_ACP, 0, strText, -1, pBuf, 0);
    pBuf = new wchar_t[nLen];
    memset(pBuf, 0, nLen * sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, 0, strText, -1, pBuf, nLen);
    file.Write(pBuf, nLen * sizeof(wchar_t));
    #else
    file.Write(strText, strText.GetLength() * sizeof(TCHAR));
    #endif
    file.Close();
    }
    catch (CException* e)
    {
    e->ReportError();
    e->Delete();
    }
      

  2.   

    谢谢了,我发现用CStdioFile类读写还是会乱码,用CFile就不会,我现在这样读写好像没有问题了,请问这样写还有不妥的地方吗?
    写文件:        CFile file;
    if (file.Open(strFilePath,CFile::modeCreate + CFile::modeReadWrite))
    {
    CString fileData(_T(""));
    int nItem = m_CDialogChange.m_Question_buff.GetSize();
    for (int i = 0; i < nItem; i++)
    {
    fileData += m_CDialogChange.m_Question_buff.GetAt(i);
    fileData += _T("\r\n");
    fileData += m_CDialogChange.m_Reply_buff.GetAt(i);
    fileData += _T("\r\n");;
    }
    BYTE bom[2] = {0xff, 0xfe};
    file.Write(bom,sizeof(bom));
    file.Write(fileData,fileData.GetLength());
    file.Close();
    }
    读文件:
    if (file.Open(strFilePath,CFile::modeRead))
    {
    int nIndex = 0;
    WCHAR* pbuff = new WCHAR[file.GetLength()/2];
    file.Read(pbuff,file.GetLength());
    CString fileBuff(pbuff);
    file.Close();
    delete(pbuff);
      

  3.   

    我现在要把txt文件读出来的数据一行一行的单独取出来处理,应该怎么做呢?
      

  4.   

     这样? 还有好一点的办法吗,感觉这个挺慢的。。
    CString fileBuff(pbuff);
    int pos = 0;
    while(!fileBuff.IsEmpty())
    {
    pos = fileBuff.Find(_T("\n"));
    if (pos <= 0)
    {
    break;
    }
    strLine = fileBuff.Left(pos);
    fileBuff = fileBuff.Mid(pos+1);
    }
      

  5.   

    一次读取存到CString类对象中,然后利用CString::Tokenize()利用_T("\r\n")作为分隔符来拆分字符串即可。
      

  6.   

    以前用多字节字符的时候,只用(_T("\n"))就可以了,这个问题解决了 用CString::Tokenize()拆分貌似执行过程跟我用strLine = fileBuff.Left(pos);
                fileBuff = fileBuff.Mid(pos+1);类似,就用这个吧,贴下完整的代码,我调试了一天可用的:int CPageHome::SaveFile(CString strFilePath)
    {
    //CStdioFile  file;
    CFile file;
    if (file.Open(strFilePath,CFile::modeCreate + CFile::modeReadWrite))
    {
    CString fileData(_T(""));
    int nItem = m_CDialogChange.m_Question_buff.GetSize();
    int i = 0;
    for (; i < nItem; i++)
    {
    fileData += m_CDialogChange.m_Question_buff.GetAt(i);
    fileData += _T("\r\n");
    fileData += m_CDialogChange.m_Reply_buff.GetAt(i);
    fileData += _T("\r\n");
    } BYTE bom[2] = {0xff, 0xfe};
    file.Write(bom,sizeof(bom));
    int nfileLeng = fileData.GetLength()*2;
    file.Write(fileData,nfileLeng);
    file.Close();
    } return 0;
    }int CPageHome::ReadFile(CString strFilePath)
    {
    //CStdioFile  file;
    CFile  file;
    CString strLine(_T(""));
    CString strNumber(_T(""));
    m_CDialogChange.m_Question_buff.RemoveAll(); // 清空数据区
    m_CDialogChange.m_Reply_buff.RemoveAll(); // 清空数据区
    m_listctrl.DeleteAllItems(); // 清空List控件显示
    if (file.Open(strFilePath,CFile::modeRead))
    {
    int nIndex = 0;
    /*while(file.ReadString(strLine))
    {
    strNumber.Format(_T("%d"),nIndex);
    m_listctrl.InsertItem(nIndex,strNumber);
    m_CDialogChange.m_Question_buff.Add(strLine);
    m_listctrl.SetItemText(nIndex, 1, strLine );
    if (file.ReadString(strLine))
    {
    m_CDialogChange.m_Reply_buff.Add(strLine);
    m_listctrl.SetItemText(nIndex, 2, strLine );
    }
    else
    {
    m_listctrl.DeleteItem(m_listctrl.GetItemCount() - 1);
    m_CDialogChange.m_Question_buff.RemoveAt(m_CDialogChange.m_Question_buff.GetSize() - 1);
    break;
    }
    nIndex++;
    }*/ WCHAR* pbuff = new WCHAR[file.GetLength()/2 + 2];
    file.Read(pbuff,file.GetLength());
    CString fileBuff(pbuff); file.Close();
    delete(pbuff);
    //delete pbuff;
    //fileBuff.Tokenize()
    int pos = 0;

    while(!fileBuff.IsEmpty())
    {
    pos = fileBuff.Find(_T("\n"));
    if (pos <= 1)
    {
    break;
    }
    strLine = fileBuff.Left(pos-1); // 将\n去掉
    //int i = strLine.GetLength();
    fileBuff = fileBuff.Mid(pos+1); strNumber.Format(_T("%d"),nIndex);
    m_listctrl.InsertItem(nIndex,strNumber);
    m_CDialogChange.m_Question_buff.Add(strLine);
    m_listctrl.SetItemText(nIndex, 1, strLine ); pos = fileBuff.Find(_T("\n"));
    if (pos <= 1)
    {
    m_listctrl.DeleteItem(m_listctrl.GetItemCount() - 1);
    m_CDialogChange.m_Question_buff.RemoveAt(m_CDialogChange.m_Question_buff.GetSize() - 1);
    break;
    }
    strLine = fileBuff.Left(pos-1);
    fileBuff = fileBuff.Mid(pos+1); m_CDialogChange.m_Reply_buff.Add(strLine);
    m_listctrl.SetItemText(nIndex, 2, strLine );
    nIndex++;
    }


    return 0;
    }