文件操作

1.       复制文件:

    UpdateData();

     //提示用户是否复制文件

     if (MessageBox("是否将原始文件复制到目标文件?","提示",MB_OKCANCEL)==IDOK)

    {    CFile *pSrcFile=NULL; CFile *pDstFile=NULL;//定义两个指向原始文件和目标文件的指针

        TRY

        {    pSrcFile=new CFile(m_szSrcFile, CFile::modeRead); //原始文件赋值给指针

             pDstFile=new CFile(m_szDrcFile, CFile::modeCreate|CFile::modeWrite);//目标文件          int nRead;   //读取的字节数

             char szBuffer[1024];  //复制缓冲区,用于将读取的数据缓存,然后写入

             //循环直到读取的字节数为0

            while (nRead=pSrcFile->Read(szBuffer,sizeof(szBuffer)))

           {       pDstFile->Write(szBuffer,nRead);           }

             pSrcFile->Close();         pDstFile->Close();//关闭文件指针

             delete pSrcFile;           delete pDstFile;//删除,否则内存泄漏

             MessageBox("文件复制成功。","提示",MB_OK); //提示复制成功

        }

        CATCH(CFileException,e)

        {   MessageBox("文件复制失败。","提示",MB_OK); //出错,提示复制失败

             if (pSrcFile!=NULL)

             {    pSrcFile->Abort(); delete pSrcFile; //安全关闭原始文件

             }

             if (pDstFile!=NULL)

             {    pDstFile->Abort(); delete pDstFile;

             }

        }

        END_CATCH

    }   

2.       剪切文件内容(从A文件把内容剪切到B文件,并删除A文件,AB两文件类型相同)

     UpdateData();

     //提示用户是否移动文件

     if (MessageBox("是否将原始文件移动到目标文件?","提示",MB_OKCANCEL)==IDOK)

    {    CFile *pSrcFile=NULL;      CFile *pDstFile=NULL;

        TRY

        {    pSrcFile=new CFile(m_szSrcFile, CFile::modeRead); //原始文件

             pDstFile=new CFile(m_szDrcFile, CFile::modeCreate|CFile::modeWrite);//目标文件

             int nRead;   //读取的字节数

             char szBuffer[1024];  //复制缓冲区,用于将读取的数据缓存,然后写入

             //循环直到读取的字节数为0

             while (nRead=pSrcFile->Read(szBuffer,sizeof(szBuffer)))

             {             pDstFile->Write(szBuffer,nRead);

             }

         pSrcFile->Close();         pDstFile->Close();

             delete pSrcFile;           delete pDstFile;

             CFile::Remove(m_szSrcFile); //删除原文件

             MessageBox("文件移动成功。","提示",MB_OK); //提示移动成功

        }

        CATCH(CFileException,e)

        {    MessageBox("文件移动失败。","提示",MB_OK); //出错,提示移动失败

             if (pSrcFile!=NULL)

             {    pSrcFile->Abort();              delete pSrcFile;

             }

             if (pDstFile!=NULL)

             {    pDstFile->Abort();              delete pDstFile;

             }

        }

        END_CATCH

     }

3.       删除文件(CFile::Remove(m_szSrcFile)见上例)

4.       创建文件

TRY

    {    //creatfilename.txt为所要创建的文件

CFile file=new CFile("creatfilename.txt",CFile::modeCreate|CFile::modeWrite);

        AfxMessageBox("creatfilename.txt文件创建成功",MB_OK);

     }

     CATCH(CFileException,e)

    {        TRACE("Error=%u",e->m_cause);   }

     END_CATCH

     }

5.       读取文件

     iniDir=strPath;//文件路径:如C:D\test.txt

     CStdioFile iniConfigFile;

     if(iniConfigFile.m_pStream=fopen(iniDir,"r+w"))//打开文件

    {    int pass[3]={0};//每班合格人数      int total[3]={0};//每班总人数

        while(!feof(iniConfigFile.m_pStream))//判断文件是否是末尾

        {    char buf[1024];//定义缓冲数组存储读取的值

             LPTSTR temp=iniConfigFile.ReadString(buf,1024);//读第一行并将值存储到缓冲数组

             CString strSrc= temp;//将指向第一行的指针赋值给strSrc

             //去掉该行的左右两端空格,回车符,跳格符

             strSrc.TrimLeft(" ");          strSrc.TrimRight("");

             strSrc.TrimRight("");           strSrc.TrimRight("");

             strSrc.TrimRight("\t");         strSrc.TrimRight("\n");

             int pos;//该行分隔符的位置

             //可以用for语句改写

             CString studentInfo[5];//用来存储第一行的以逗号做为分隔符的值

             for(int i=0;i<4;i++)

             {    pos=strSrc.FindOneOf(",");

                  studentInfo[i]=strSrc.Left(pos);

                  strSrc=strSrc.Right(strSrc.GetLength()-pos-1);

             }

             studentInfo[4]=strSrc;

//以下是对读取到的数据进行处理,好写在数据库中,不是本处的重点,详细代码,参考DataTODataBase的源码

//以下三行代码是将CString类型转换为整型的代码

                  char * pchar2=studentInfo[4].GetBuffer(studentInfo[4].GetLength());

                  int iscore=atoi(pchar2);

                  if(iscore>=60) pass[0]++;

             }

     }

else

     {

        CString err;

        err.Format("找不到文件:%S \n",iniDir);

        AfxMessageBox(err,MB_ICONSTOP);

     }

     iniConfigFile.Close();

     //为了避免重复转换最好导入后将原始数据删除

    remove(iniDir);

6.       写文件

     CString classid[3]={"class1","class2","class3"};

        float yield[3]={0.0};//班级合格率

        for(int i=0;i<3;i++)

        {    yield[i]=float(pass[i])/float(total[i]);

             WriteTotalToDataBase(classid[i],total[i],pass[i],yield[i]);

//该函数是将每个班的总信息写入到classTotal表中

        }

        //用C语言写入到classTotal.txt中,

        string filename="classTotal.txt";

        FILE * fh;

        fh = fopen(filename.c_str(),"wb");

        if(fh == NULL) {   AfxMessageBox("被写入的文件打开失败",MB_OK);  }

        CString total_str[3],pass_str[3],yield_str[3];

        for(int i=0;i<3;i++)

        {    //以下三句是把int型转化为CString型

total_str[i].Format("%d",total[i]);       pass_str[i].Format("%d",pass[i]);

             yield_str[i].Format("%f",yield[i]);

        }

       for(int i=0;i<3;i++)

        {//定义以个string类型用来连接以上信息值

string filecontents=classid[i] +"," +total_str[i] + "," +pass_str[i] + "," +yield_str[i]+ "\t";

        fprintf(fh,filecontents.c_str());//将信息写入fh

        }

         AfxMessageBox("数据成功写入classTotal.txt",MB_OK);

        if(fclose(fh) != 0)

        {        AfxMessageBox("被写入的文件关闭失败",MB_OK);      }

      //用C++语言写入到classTotal1.txt中

        CStdioFile mFile;

        CFileException mExcept;

        mFile.Open("classTotal1.txt", CFile::modeWrite, &mExcept);

        CString filecontents1;

        for(int i=0;i<3;i++)

        {

      filecontents1=classid[i] + "," +total_str[i] + "," +pass_str[i] + "," +yield_str[i]+ "\n";

            mFile.WriteString(filecontents1);

        }

         AfxMessageBox("数据成功写入classTotal1.txt",MB_OK);

         mFile.Close();

7.       待续……..

你可能感兴趣的:(文件操作)