现在的位置: 首页 > 综合 > 正文

VC中的文件操作

2013年12月20日 ⁄ 综合 ⁄ 共 4467字 ⁄ 字号 评论关闭

      在VC中对文件的操作主要有以下几种方法:1、使用C++中的ofstream类和ifstream类完成对文件的读写;2、使用C语言中的C文件达到目的;3、使用Win32的API函数;4、在MFC程序中,可以借助MFC封装的CFile类对文件进行操作。

      首先,在头文件中包含fstream.h。

      在向文件中写入数据时,可以使用C++的ofstream类,在从文件中读取数据时,可以使用C++中的ifstream类。

      创建ofstream对象,使用该对象的write方法向制定的文件中写入数据,如下所示:

#include "fstream.h"

...

ofstream ofs("1.txt");

ofs.write("http://www.cte.com.cn",strlen("http://www.cte.com.cn"));

ofs.close();

...

      创建ifstream对象,使用该对象的read方法从制定的文件中读取数据,如下所示:

...

ifstream ifs("1.txt");

char ch[100];

memset(ch,0,100);

ifs.read(ch,100);

ifs.close();

...

      在MFC中使用ifstream返回文件的每一行的方法如下例所示:

CString strFileNameTemp;
std::string strOneLine;

strFileNameTemp.Empty();
memset(&strOneLine,0,sizeof(std::string));

strFileNameTemp = m_strCurrentDir;
strFileNameTemp += _T("\\UninstallClear.txt");

std::ifstream UIifs(strFileNameTemp);

while(!UIifs.eof())
{
getline(UIifs,strOneLine);
}

UIifs.close();

      上面是使用C++类来完成文件的读写操作,在编写VC程序时,也可以使用C语言的C文件完成对文件的操作。如下所示:

//完成读操作

FILE *pFile = fopen("1.txt","w");

char ch[3];

ch[0] = 'a';

ch[1] = 'b';

ch[2] = 'c';

fwrite(ch,1,3,pFile);

//完成写操作

FILE *pFile = fopen("1.txt","r");

char ch[100];

memset(ch,0,100);

fread(ch,1,100,pFile);

fclose(pFile);

fclose(pFile);

      在VC中使用的FILE结构体定义在MBSTRING.h头文件中,定义如下:

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

      在C语言中,FILE结构体定义在stdio.h文件中。一种版本的实现如下:

typedef struct{

    short level;    //缓冲区“满”或“空”的程度

    unsigned flags;    //文件状态标志

    char fd;    //文件描述符

    unsigned char hold;    //如无缓冲区,则不读取字符

    short bsize;    //缓冲区的大小

    unsigned char * buffer;    //数据缓冲区的位置

    unsigned char * curp;      //指针,当前的指向

    unsigned istemp;    //临时文件,指示器

    short token;    //用于有效性检查

}FILE;

      在Win32 API中对文进行操作的方法:

      由于操作系统将计算机中的一些设备都抽象成文件,并按照操作文件的形式进行设备的操作。所以,Win32 API函数CreateFile可以打开Consoles(控制台)、Communications resources(通信资源)、Directories(open only)(目录)、Disk Devices(Windows NT/2000 only)(磁盘设备)、Files(文件)、Mailslots(邮件槽)、Pipes(管道)。其原型如下:

HANDLE CreateFile(
        LPCTSTRlpFileName,     // 文件名。
        DWORD dwDesiredAccess, // 访问模式:GENERIC_READ、GENERIC_WRITE。
        DWORD dwShareMode,    // 共享模式:0不共享。
        LPSECURITY_ATTRIBUTES lpSecurityAttributes,     

                      /*

                       *指定创建的文件对象的访问权限以及返回文件对象的句柄能否被子进程

                       *进程,在服务器端有效。可以传递NULL使用缺省的安全性。

                     */
        DWORD dwCreationDisposition,    

                     /*

                      *创建方式:CREATE_NEW、CREATE_ALWAYS、OPEN_EXISTING、

                      *OPEN_ALWAYS、TRUNCATE_EXISTING。

                     */
        DWORD dwFlagsAndAttributes,    // 文件属性,用于设置文件属性和标记。
        HANDLE hTemplateFile    

                      /*

                       *指定使用GENERIC_READ访问方式打开的模板文件的句柄。档传递

                       *该参数时,CreateFile会忽略dwFlagsAndAttributes设定的文件属性和

                       *标记,而使用hTemplateFile标示的文件相关联的属性。在打开现有文

                       *件时,该参数被忽略。

                      */
);

      使用WriteFile函数向文件中写入数据,其原型如下:

BOOL WriteFile(
  HANDLE hFile,                    //文件句柄
  LPCVOID lpBuffer,                //包含数据的指针
  DWORD nNumberOfBytesToWrite,     //待写入的字节数
  LPDWORD lpNumberOfBytesWritten,  //指向实际写入到文件中的字节数的变量
  LPOVERLAPPED lpOverlapped        

              /*

               *指向OVERLAPPED结构体的指针,需加入FILE_FLAG_OVERLAPPED

               *标记(异步操作标记)

               */
);

      如下例所示:

/*

*以读取的方式新创建一个非共享、使用缺省安全性(对象的创建者和其所在的组拥有所

*有权限,其他成员无权访问该对象)、无其他属性集、无模板文件句柄的文件1.txt

*/

HANDLE hFile;
hFile = CreateFile("1.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);

/*

*以读取的方式新创建一个非共享、使用缺省安全性(对象的创建者和其所在的组拥有所

*有权限,其他成员无权访问该对象)、无其他属性集、无模板文件句柄的文件1.txt

*/

DWORD dwWrites;

WriteFile(hFIle,"http://www.cte.com.cn",stelen("http://www.cte.com.cn"),&dwWrites,NULL);

CloseHandle(hFile);//关闭文件句柄

      使用ReadFile函数读取文件中的内容,函数说明如下:

BOOL ReadFile(

      HANDLE hFile,//文件句柄

      LPVOID lpBuffer,//用于接收从文件中读取的数据的指针

      DWORD nNumberOfBytesToRead,//指定从文件中读取的字节数

      LPDWORD lpNumberOfBytesToRead,//接收实际读取的字节数的指针变量

      LPOVERLAPPED lpOverlapped)

      如下例所示:

HANDLE hFile;
hFile = CreateFile("1.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
char ch[100];
DWORD dwReads;
ReadFile(hFile,ch,100,&dwReads,NULL);
ch[dwReads]=0;    //设置字符串结尾
CloseHandle(hFile);

      也可以采用MFC中提供的对文件操作的类:CFile类。

      该类是微软基础文件类的基类,直接提过了无缓存的二进制磁盘输入输出服务,通过其派生类而间接地支持文本文件和内存文件。

      操作实例如下:

/*

 *写入文件

 *创建仅支持写入方式的文件1.txt

*/

CFile file("1.txt",CFile::modeCreate|CFile::modeWrite);
file.Write("http://www.cte6.com.cn",strlen("http://www.cte6.com.cn"));

file.Close();//关闭文件

//读取文件

CFile file("1.txt",CFile::modeRead);
char *pBuf;
DWORD dwFileLen;
dwFileLen=file.GetLength();
pBuf = new char[dwFileLen+1];
pBuf[dwFileLen] = 0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);

      如和在MFC中需要将其中可能使用的CString对象中的内容写入到文件中呢?可看看下面的例子:

std::ofstream UIofs;

UIofs.open("1.txt");

...

CString ZipFilesAttribute;

...

std::string s1 = CStringA(ZipFilesAttribute);
UIofs<<s1.c_str();
UIofs.put('\r');    //向文件中加入回车换行
UIofs.put('\n');

...

UIofs.close();

抱歉!评论已关闭.