void CTestDlg::OnOk1() 
{
// TODO: Add your control notification handler code here
CString pFileName1("D:\\prj\\work\\Project\\test.dat"); //定义文件名
CString pFileName2("D:\\prj\\work\\Project\\test.c");   //定义文件名
UINT  utFLength;//保存文件长度
// char *cBuffer=NULL;
//char cTemp;     //临时变量
CFile fMyFile;  //读文件对象
CFile fToFile;  //写文件对象
CFileException Except;//文件异常变量
CClientDC dc(this);
int i = 0;
if(!fMyFile.Open(pFileName1,CFile::modeRead|CFile::typeBinary))//只读的形式打开二进制文件/*CFile::typeBinary*/
{
TRACE("Can't open file %s\n",pFileName1);
}
else //打开成功
{
////////////////////////////////////////////////////////////////
//读取字符操作
utFLength = fMyFile.GetLength();   //获取文件长度
char *cBuffer = new char[utFLength];     //缓冲区
if(cBuffer == NULL)
{
return;
}
for(int i=0; i < utFLength ;i++)
cBuffer[i] = 0;
fMyFile.SeekToBegin();             //将文件读写位指针移动到文件开头
//fMyFile.GetPosition();             //取得目前文件读写位置指针
// char f[100];
// fMyFile.Read(f,100);
fMyFile.Read(cBuffer,utFLength);  //从二进制文件中读取数据到缓冲区(内存)cBuffer中
if(!fToFile.Open(pFileName2,CFile::modeCreate|CFile::modeReadWrite,&Except))//打开或创建文件test.c
{
switch(Except.m_cause)//判定文件异常的原因
{
case CFileException::fileNotFound:
printf("ERROR:Fllc nol foint\n");
break;
case CFileException::badPath:
printf("ERROR:Path is invalid\n");
break;
default:
printf("ERROR:file faill");
break;
}
}
else
{
//写操作
//printf("Open the fToFile sucss! Now start Write the file.");
fToFile.Write("uSnsigned char pdata[] = {\r\n",strlen("unsigned char pdata[] = {\r\n"));//写入数组部分
while(1)
{
for(i=0; i < utFLength; i++)
{
fToFile.Write("0x",strlen("0x"));
char cTemp ; //临时变量
                                cTemp = _T(cBuffer[i]); //sprintf(ret+strlen(ret),"%02X",str[i]);   
CString str;
str.Format("%x",cBuffer[i]);
afxDump << str << "\n "; //char Char = TEXT(sprintf(cTemp, "%c", cBuffer[i]));
//MessageBox(str); 
//cTemp = cBuffer[i];
//_T(sprintf(buf, "字符串"))
//_T(sprintf(buf, "%c", 字符))
//char Bhigh = (cTemp&0xf000)>>4;
//char Blow = (cTemp&0x0f00); //fToFile.Write(&Bhigh,1);
//fToFile.Write(&Blow,1); fToFile.Write(&cTemp,2);
//fToFile.Write("AF",strlen("AF"));
fToFile.Write(",\n",strlen(",\n"));
}
//fToFile.Write(cBuffer,utFLength);
fToFile.Write("};\r\n",strlen("};\r\n"));
fToFile.Close();
break;
}
}
     fMyFile.Close(); if(cBuffer != NULL)
{
delete cBuffer;//释放内存
cBuffer = NULL;
} }}

解决方案 »

  1.   

    cTemp = _T(cBuffer[i]);
    这也能通过编译?而且不知道什么意思。
    你的cTemp明明是一个字节,写入的时候fToFile.Write(&cTemp,2);为什么要写入两个字节?况且这个值似乎没有被修改过。
    其实要把数值以文本方式写入文件,用fprintf倒是很方便,直接格式化写入就可以了。
      

  2.   

    代码有点乱,我做了些修改~~~调试时出现不致命错误,Mackz帮我看看是不是我的sprintf用错了?
                                   for(i=0; i < utFLength; i++)
    {
    fToFile.Write("0x",strlen("0x"));
    char *cTemp ;                //临时变量


    sprintf(cTemp,"%c", cBuffer[i]);   
    CString str;
    str.Format("%x",cBuffer[i]);
    afxDump << str << "\n ";
    //cTemp = _T(str);

    //char Char = TEXT(sprintf(cTemp, "%c", cBuffer[i]));
    //MessageBox(str); 
    //cTemp = cBuffer[i];
    //_T(sprintf(buf, "字符串"))
    //_T(sprintf(buf, "%c", 字符))

    fToFile.Write(cTemp,1);
    //fToFile.Write("AF",strlen("AF"));
    fToFile.Write(",\n",strlen(",\n"));
    }
      

  3.   

    void CTestDlg::OnButtonCaozuo() 
    {
    CFile f;
    CFileException e;
    char* pFileName = "C:\\1.txt";//里面输入  “123456789”
    if( !f.Open( pFileName, CFile::modeRead | CFile::typeBinary, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    return ;
    } DWORD dwFileLen = f.GetLength();
    BYTE *pbyData = new BYTE[dwFileLen];
    f.ReadHuge(pbyData,dwFileLen);
    f.Close();
    //文件数据已经在pbyData所指的内存里了
    if( !f.Open( "c:\\2.txt", CFile::modeCreate | CFile::modeWrite, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    return ;
    }
    char szData[10];
    for(DWORD i=0;i<dwFileLen;i++)
    {
    memset(szData,0,10*sizeof(char));
    sprintf(szData, "0x%X", *(pbyData+i)  ); //大写16 进制 
    f.Write(szData,10);
    f.SeekToEnd();
    }
    f.Close();
    delete [] pbyData;
    //2.txt中的值为,是1.txt中16进制数据
    //0x31      0x32      0x33      0x34      0x35      0x36      0x37      0x38      0x39      
    }
      

  4.   

    谢谢“Mackz”and“henry3695”,我已经做出来了,我们的思维方式虽然正确,但做错了方向,从二进制文件中读出来的值,不能指望Sprintf对它进行格式化处理,不能实现字符的转换(到现在我都不知道为什么)。我的方法是每次取一个数,分别对高4位和低四位进行字符化处理,实现了我要的结果:
    // TODO: Add your control notification handler code here
    CString pFileName1("D:\\prj\\work\\Project\\test.dat"); //定义文件名
    CString pFileName2("D:\\prj\\work\\Project\\test.c");   //定义文件名
    UINT  utFLength;//保存文件长度
    CFile fMyFile;  //读文件对象
    CFile fToFile;  //写文件对象
    CFileException Except;//文件异常变量
    CClientDC dc(this);
    int i = 0;

    if(!fMyFile.Open(pFileName1,CFile::modeRead|CFile::typeBinary))//只读的形式打开二进制文件/*CFile::typeBinary*/
    {
    TRACE("Can't open file %s\n",pFileName1);
    }
    else //打开成功
    {
    ////////////////////////////////////////////////////////////////
    //读取字符操作
    utFLength = fMyFile.GetLength();   //获取文件长度
    char *cBuffer = new char[utFLength];     //缓冲区
    if(cBuffer == NULL)
    {
    return;
    }
    for(int i=0; i < utFLength ;i++)
    fMyFile.Read(cBuffer,utFLength);  //从二进制文件中读取数据到缓冲区(内存)cBuffer中
    if(!fToFile.Open(pFileName2,CFile::modeCreate|CFile::modeReadWrite,&Except))//打开或创建文件test.c
    {
    switch(Except.m_cause)//判定文件异常的原因
    {
    case CFileException::fileNotFound:
    printf("ERROR:Fllc nol foint\n");
    break;
    case CFileException::badPath:
    printf("ERROR:Path is invalid\n");
    break;
    default:
    printf("ERROR:file faill");
    break;
    }
    }
    else
    {
    //写操作
    fToFile.Write("unsigned char   g_headerBuf[512] = \r\n{\r\n",strlen("unsigned char   g_headerBuf[512] = \r\n{\r\n"));//写入数组部分
    while(1)
    {

    for(i=0; i < utFLength; i++)
    {
    fToFile.Write("0x",strlen("0x"));
    char cTemp = cBuffer[i];
    char bHigh = (cTemp&0xf0)>>4;
    char bLow = cTemp&0x0f;
    char CHigh;
    char CLow;
    int j=0;

    short int iHexArray[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
    char CharArray[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',};
    /*==========================================写高位=================================*/
    for(j=0;j<16;j++)
    {
    if(bHigh == iHexArray[j])
    {
    CHigh = CharArray[j];
    break;
    }
    }
    fToFile.Write(&CHigh,1); // 写操作
    /*==========================================写低位=================================*/
    for(j=0;j<16;j++)
    {
    if(bLow  == iHexArray[j])
    {
    CLow = CharArray[j];
    break;
    }
    }

    fToFile.Write(&CLow,1);
    fToFile.Write(",\r\n",strlen(",\r\n"));
    }
    fToFile.Write("};\r\n",strlen("};\r\n"));
    fToFile.Close();
    break;
    }
    }
    fMyFile.Close();

    if(cBuffer != NULL)
    {
    delete cBuffer;//释放内存
    cBuffer = NULL;
    }

    }