zoukankan      html  css  js  c++  java
  • 文件操作

    1、C文件操作

    2、c++文件操作

    3、MFC文件操作:CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作,并通过其派生类支持文本文件、内存文件和socket文件。

    Visual C++处理的文件通常分为两种:

    文本文件:只可被任意文本编辑器读取ASCII文本。

    二进制文件:指对包含任意格式或无格式数据的文件的统称。

     

    1、定义文件变量

    定义文件变量格式:CStdioFile 文件变量;

    例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1;

     

    2、打开指定文件

    可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):

    CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);

    实例1:以只读方式打开一个文件

    步骤:

    使用AppWizard创建一个对话框应用程序,删除其自动产生的所有控件,添加一个Button控件。双击控件,在相应的函数里添加代码:

    char * pszFileName="C://myfile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),&fileException)

    {

    TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

    }

    运行结果:如果C:/下没有myfile.txt文件,则新生成该文件。

    3.向从文本文件中写入信息

    CStdioFile提供了函数WriteString来向文本文件中写入文本,WriteString函数的格式如下:

    void WriteString(LPCTSTR lpsz);

    WriteString的参数lpsz是一个以”/0”字符结束的字符串,要把这个字符串的内容写入文件。

    提示:使用WriteString函数时,如果希望每执行一次WriteString,文本文件中的内容就会自动换行一次,那么就需要在需要换行的地方输出“/n”:

    myFile.WriteString(“第1行/n”);

    实例2:向文件中写入文本

    建立MFC基于对话框的程序,删除自动添加的所有控件,添加一个“确定”按钮,双击按钮,按默认添加事件函数,双击按钮,在相应的函数处添加如下代码:

    char* pszFileName="C://myfile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

    {

    myFile.WriteString("第1行/n");

    CString strOrder;

    strOrder.Format("%d,%.3f",66,88.88);

    myFile.WriteString(strOrder);

    }

    else

    {

    TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

    }

    程序运行结果:C:/myfile.txt文件中内容如下:

    第1行

    66,88.880

    4.从文本文件中读取信息

    CStidoFile提供了函数ReadString来读取文本,ReadString有两种形式,一种为:

    virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax);

    ReadString函数的参数如下:

    lpsz :是用户提供的一个指向字符串的指针,它用来接受从文件读出的文本,以”/0”结束。

    nMax是本次所允许读入的文本字符个数,不计“/0”字符,也就是说最多能读入nMax-1个文本字符。

    ReadString的返回值是一个LPTSTR类型的指针,它指向从文件读出的文本字符串,如果到达文件尾,则返回NULL。

    ReadString的另一种形式为:

    BOOL ReadString(CString& rString);

    参数rString用来容纳从文件读出的文本。

    CString版本忽略回车换行符,返回值是一个布尔值。如果返回值为FALSE,表示因到达文件尾而没有读到任何字符。

    提示:每执行一次ReadString,就会自动从文本文件中读取一行数据,同时文件操作指针会自动跳转到下一行。

    实例3:从文件中读取文本信息

    步骤:创建基于对话框的MFC程序,删除所有自动添加的控件,添加按钮控件,为按钮添加事件,并在相应的函数处,添加如下代码:

    char* pszFileName="C://myfile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(pszFileName,CFile::typeText|CFile::modeReadWrite),&fileException)

    {

    myFile.SeekToBegin();

    CString str1;

    myFile.ReadString(str1);

    CString str2;

    myFile.ReadString(str2);

    AfxMessageBox(str1+str2);

    }

    else

    {

    TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

    }

    myFile.Close();

    5.关闭文件

    对文件的操作完成后,使用CloseFile关闭文件。

    函数CStdioFile::Close关闭一个文件,一般一个文件使用完毕就应该关闭它:

    myFile.Close();

    错误的文本文件读写过程

    在读写文本文件的时候,最常见的错误是---操作文件不存在。这种错误产生的典型原因有:

    1.路径错误

    char * pszFileName="C://Windows//MyFile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),&fileException)

    {

    //文件操作代码

    }

    else

    {

    TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

    }

    myFile.Close();

    由于将文件变量与一个绝对路径的文件名关联,而程序的数据通常存储在相对路径下,所以一旦相对路径和相对路径不一致时,就会出错。

    举例而言,上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据,但是如果操作系统安装的路径不是C:/Windwos,而是C:/Winnt,那么这段程序就会出错。

    解决方法是在程序中使用相对路径,改正后的程序如下:

    //获取windows路径

    LPTSTR lpBuffer=new char[MAX_PATH];

    ::GetWindowsDirectory(lpBuffer,MAX_PATH);

    strcat(lpBuffer,"//MyFile.txt");

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

    {

    //文件操作代码

    }

    else

    {

    TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

    }

    CString strFileTitle="MyFile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeReadWrite),&fileException)

    {

    //文件操作代码

    myFile.WriteString("测试!");

    }

    else

    {

    TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

    }

    myFile.Close();

    2.操作文件不存在

    如果应用程序所有路径下面不存在MyFile.txt文件,那么在WriteString写入信息时就会出错。

    解决办法就是在程序中打开文件前要检查是否存在此文件。如下程序:

    CString strFileTitle="MyFile.txt";

    CFileFind finder;

    if(finder.FindFile(strFileTitle))

    {

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

    {

    //文件操作代码

    }

    else

    {

    TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

    }

    }

    else

    {

    TRACE("Can't find file %s/n",strFileTitle);

    }

    myFile.Close();

    3.超越文件权限进行读写操作

    在打开文件的过程中,通过参数指定了文件的读写权限,如果读写的操作没有和相应的权限对应,就会出现错误。

    下面的程序就是典型的忽略了文件操作权限的例子:

    CString strFileTitle="MyFile.txt";

    CStdioFile myFile;

    CFileException fileException;

    if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeCreate|CFile::NoTruncate|CFile::modeRead),&fileException)

    {

    //文件操作代码

    myFile.WriteString("测试!");

    }

    else

    {

    TRACE("Can't open file %s,error=%u/n",strFileTitle,fileException.m_cause);

    }

    myFile.Close();

  • 相关阅读:
    网易云课堂--妙味 《js基础课程》
    salesforce 零基础学习(五十八)通过sObject的field返回其对应的基础类型
    salesforce 零基础学习(五十七)Test 类中创建TestUser帮助类
    salesforce 零基础学习(五十六)实现getById
    salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中
    salesforce 零基础学习(五十四)常见异常友好消息提示
    salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)
    salesforce 零基础学习(五十二)Trigger使用篇(二)
    salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
    salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List
  • 原文地址:https://www.cnblogs.com/renyuan/p/3970472.html
Copyright © 2011-2022 走看看