我现在想实现由dat格式转为txt。但是实现出错了。不知道怎么回事。
代码如下。
CFileDialog datdlg(TRUE,"文件转换",".dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"dat(*.dat)|*.dat||");
if(datdlg.DoModal()==IDOK)
{
                  CString sdatPath1="";
sdatPath1 = datdlg.GetPathName();
TCHAR* pOldName = _T(sdatPath1);
int datpos1;
datpos1=sdatPath1.ReverseFind('\\');
sdatPath1=sdatPath1.Left(datpos1);
CString sdatNPath1;
sdatNPath1=sdatPath1 + "\\data21.txt"; TCHAR* pNewName = _T(sdatNPath1);
try
{
CFile::Rename(pOldName, pNewName);
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}
//修改文件后缀名
}
但是出现error C2440: 'initializing' : cannot convert from 'class CString' to 'char *'
请问如何解决啊。
我是想把打开的文件里dat文件转为txt格式。请问有什么方法吗?

解决方案 »

  1.   

    ".dat"是二进制格式,".txt"应该是Hex格式。
      

  2.   

    不能转化成 TCHAR *,但可以转化成 LPCTSTR,也就是 const TCHAR *;如果一定要转化成 TCHAR *,使用 str.GetBuffer(str.GetLength());
      

  3.   

    TCHAR* pOldName = sdatPath1.GetBuffer(256);
    或者:
    TCHAR* pOldName = (LPTSTR)(LPTCSTR)sdatPath1;
      

  4.   


    那么如果不能转化成TCHAR *
    那有什么方法VC中改变后缀呢?
      

  5.   

    CFile::Rename 其实不需要 TCHAR *,只要 LPCTSTR 就可以了
      

  6.   

    我改了代码
    CString sdatPath1="";
    sdatPath1 = datdlg.GetPathName();
    LPCTSTR pOldName = sdatPath1;
    // TCHAR* pOldName = _T(sdatPath1);//"E:\\GisProTest\\可读取TXT\\data.dat"
    int datpos1;
    datpos1=sdatPath1.ReverseFind('\\');
    sdatPath1=sdatPath1.Left(datpos1);
    CString sdatNPath1;
    sdatNPath1=sdatPath1 + "\\data21.txt";// TCHAR* pNewName = _T(sdatNPath1);//"E:\\GisProTest\\可读取TXT\\data.txt"
    LPCTSTR pNewName = sdatNPath1;
    try
    {
    CFile::Rename(pOldName, pNewName);
    }
    catch(CFileException* e)
    {
    e->ReportError();
    e->Delete();
    }
    但是提示没有找到 一未命名文件。请问是怎么回事? 
    调试到
    e->ReportError();
    这就卡了。
      

  7.   

    断点在CFile::Rename(pOldName, pNewName);看看pOldName, pNewName
      

  8.   


    Old 和New 都变了。就是
    e->ReportError();
    e->Delete();
    这边出了问题,具体
    值是对的。已经换了名。
      

  9.   

    CFile exception: fileNotFound, File Unknown, OS error information = 2.
    调试到了e->ReportError();出现的
      

  10.   

    Old 和New 都变了
    Old="E:\\GisProTest\\可读取TXT\\data.dat"?
    path对不对?是不是只读的?
    提示没有找到 一未命名文件,就是Path不对
      

  11.   


    sdatPath1对的啊。我看了pNewName和pOldName也变了。sdatNPath1也是对的。
    目录下文件是在的。怎么会提示找不到未命名文件。
    pOldName里最后是乱码:屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯。
      

  12.   

    sdatPath1 = datdlg.GetPathName();什么东西?
      

  13.   


    因为这个目录路径是不确定的。所以我我搜索了下,然后找到路径的。GetCurrentDirctory获取的是当前的进程的路径。那不就是程序的路径?但是我是找到txt文档的路径啊。
      

  14.   

    TCHAR* pNewName = _T(sdatNPath1);
    -----------------------------------
    囧,哪能这么写的?
      

  15.   

    你是要把dat文件的数据读出来,处理以后写入txt文件中,还是只是简单的重命名,将后缀名由dat转成txt呢?
      

  16.   


    简单的后缀名改。关键是要把上一步保存的文件txt保存为dat,因为不知道路径,所以我添加了打开对话框,找到路径。对于
    TCHAR* pNewName = _T(sdatNPath1);
    我不太了解。没仔细看函数说明。呵呵。
      

  17.   

    sdatPath1 = datdlg.GetPathName();
    要在打开CFileDialog后保存好。datdlg关闭后不取出保存为没有的。
      

  18.   


    我定义了static了,值不是不变了吗。全局局部变量
      

  19.   

    CString sdatPath1="";
    sdatPath1 = datdlg.GetPathName();
    LPCTSTR pOldName = sdatPath1;
    //  TCHAR* pOldName = _T(sdatPath1);//"E:\\GisProTest\\可读取TXT\\data.dat"
    int datpos1;
    datpos1=sdatPath1.ReverseFind('\\');
    //sdatPath1=sdatPath1.Left(datpos1);//sdatPath1被修改了
    CString sdatNPath1;
    sdatNPath1=sdatPath1.Left(datpos1);
    sdatNPath1+= "\\data21.txt";
    //  TCHAR* pNewName = _T(sdatNPath1);//"E:\\GisProTest\\可读取TXT\\data.txt"
    LPCTSTR pNewName = sdatNPath1;
    try
    {
    CFile::Rename(pOldName, pNewName);
    }
    catch(CFileException* e)
    {
    e->ReportError();
    e->Delete();
    }
      

  20.   


    再定义一个String就可以了?
      

  21.   


    刚才看错了。以为代码是另外一个呢。引用 24 楼 schlafenhamster 的回复:
    sdatPath1 = datdlg.GetPathName();
    要在打开CFileDialog后保存好。datdlg关闭后不取出保存为没有的。我定义了static了,值不是不变了吗。全局局部变量
    看错了。
      

  22.   


    就是如果达到我要的先找到文件的路径,然后通过
    CFile::Rename(pOldName, pNewName);
    怎么改呢?呵呵,这两天忙其他问题了,现在继续想问问这个问题。呵呵。