CFile CStdioFile CArchive 文件操作之异同(详细)

两者的主要区别:

一. CFile类操作文件默认的是Binary模式,CStdioFile类操作文件默认的是Text模式。
    在Binary模式下我们必须输入‘\r\n‘,才能起到回车换行的效果,‘\r‘只是回车(回到当前行的第一列),‘\n‘只是换行(到达下一行的当前列)。 而在Text模式下‘\r‘的工作是自动完成的,当我们写一个‘\n‘的时候,系统会自动帮我们在其前面加上一个‘\r‘,然后保存到文件里。另外,CFile::typeText只能在CFile的子类中使用,CFile自身的Read函数不能使用CFile::typeText和CFile::typeBinary
二. File 是C和C++的函数! mfc中使用了CFile类进行相同的文件操作功能! 
    CStdioFile继承了CFile   是CFile的子类,扩展了文本文件的操作,认识回车换行字符,可以进行一行字符串的读写!
三. Cfile类提供了基于二进制流的文件操作,功能类似于C语言中的fread()和fwrite()函数。CStdioFile提供了基于字符串流的文件操作,功能类似于C语言中的fgets()和fputs()函数。
四. CStdioFile继承了CFile类,特有的函数是ReadString(),WriteString(),但是不支持Duplicate(),Lockrange(),UnLockRange(),相当于流式文件的操作。
五.CArchive 对象提供了一个类型安全缓冲机制,用于将可序列化对象写入 CFile 对象或从中读取可序列化对象。通常,CFile 对象表示磁盘文件;但是,它也可以是表示“剪贴板”的内存文件(CSharedFile 对象)。

CStdioFile

构造函数

编辑

CStdioFile();

CStdioFile( CAtlTransactionManager* pTM);

CStdioFile( FILE* pOpenStream );//参数指的是c运行函数fopen调用后返回的文件指针。

CStdioFile( LPCTSTR lpszFileName,UINT nOpenFlags );

CStdioFile( LPCTSTR lpszFileName,//指的是被打开的文件(绝对地址或相对地址)

UINT nOpenFlags, //指的是CFile类中所描述的打开文件的方式。可以按位指定多个选项通过使用或(|)运算符。

CAtlTransactionManager* pTM);

参数解释

LPCTSTR lpszFileName,//被打开的文件的路径(绝对地址或相对地址);

FILE* pOpenStream;//c运行函数fopen调用后返回的文件指针;

UINT nOpenFlags; //指的是CFile类中所描述的打开文件的方式。可以按位指定多个选项通过使用或(|)运算符;

CAtlTransactionManager* pTM;//为CAtlTransactionManager对象的指针。

成员函数

编辑

CStdioFile::Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError = NULL);

参数解释见构造函数。

当对象定义时未给出构造函数参数,则调用第一个构造函数,此时需要调用open函数打开文件。

CStdioFile::ReadString(LPTSTR lpsz, UINT nMax);

参数:

lpsz;//指定指向将接收Null终止的文本字符串的用户提供的缓冲区的指针;

nMax;//指定不受的最大字符数读取,终止null字符;

返回值:

如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE。

说明:

读取一行文本到缓冲区,遇到“0x0D,0x0A”时停止读取,并且去掉硬回车“0x0D”,保留换行符“0x0A”,在字符串末尾添加“\0”(0x00)。nMax个字符里包含0x00这个字符。分析如下:

1)如果nMax <= 字符数,读取(nMax-1)个字符 + 0x00

2)如果nMax = 字符数 + 1,读取nMax个字符 + 0x00

3)如果nMax > 字符数,读取nMax个字符 + 0x0A + 0x00

CStdioFile::ReadString(CString &rString);(重载

参数:

rString;//CString类的字符串

返回值:

如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE。

说明:

读取一行文本到rString中,遇到回车换行符停止读取,回车和换行符均不读到rString中,尾部也不添加”0x00”。

CStdioFile::WriteString( LPCTSTR lpsz );(不支持CString直接写入)

将一个缓冲区中的数据写入与CStdioFile 对象关联的文件中。结束的空字符(“\0”)不被写入该文件。lpsz 中的所有换行符都被以一个硬回车换行符对写入该文件,即“\n”被转化成“\r\n”写入到文件里。

CStdioFile::Seek( LONGLONG lOff, UINT nFrom );

重新定位以前打开的文件的指针。

参数:

Off;//移动指针的字节数。

nFrom;//指针移到模式。必须为下列值之一:

    • CFile::begin:从文件开始将文件指针 移动lOff字节。
    • CFile::current:从当前位置将文件指针移动lOff字节。
    • CFile::end:从文件的结尾将文件指针移动lOff

Note thatlOffmust be negative to seek into the existing file; positive values will seek past the end of the file.
  返回值:

如果请求的位置是非法的,Seek将会从文件的开始返回新的字节偏移量。否则,返回值是未定义的,并引发CFileException对象。

程序例:

编辑

CStdioFile file;

file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);//写入文件

CString str;

str.Format("%s\r\n","hello!I am talkingmute!");(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)

file.Seek(0,CFile::end);

file.WriteString( str );

//关闭文件

file.Close();

比如:读文件的例子

CString strText = “”;

CString szLine = “”;

//打开文件

CStdioFile file;

file.Open("ts.txt",CFile::modeRead);

//逐行读取字符串

while( file.ReadString( szLine ) )

{

strText += szLine;

}

MessageBox(strText);

//关闭文件

file.Close();

CFile

CFile是MFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并间接地通过派生类支持文本文件和内存文件。CFile与CArchive类共同使用,支持MFC对象的串行化

该类与其派生类的层次关系让程序通过多形CFile接口操作所有文件对象。例如,一个内存文件相当一个磁盘文件。

使用CFile及其派生类进行一般目的的磁盘I/O,使用ofstream或其它Microsoft输入输出流类将格式化文本送到磁盘文件。

通常,一个磁盘文件在CFile构造时自动打开并在析构时关闭。静态成员函数使你可以在不打开文件的情况下检查文件状态。

使用前包含头文件  #include <afx.h>

CFile类的成员

编辑

数据成员

m_hFile 常包含操作系统文件句柄

构造函数

CFile 从一个路径或文件句柄构造一个CFile对象;

Abort 不管任何警告和错误,关闭一个文件;

Duplicate 构造一个基于该文件的副本;

Open 带错误检验选项,安全打开一个文件;

Close 关闭文件,删除对象。

输入/输出

Read 从文件的当前位置读数据;

ReadHuge 可从文件的当前位置读取大于64K数据,在32位编程中废弃了,见Read;

Write 将文件数据写入当前文件位置;

WriteHuge 可将文件的大于64K数据写到当前文件位置,在32位编程中废弃了,见Write;

Flush 溢去未被写入的任何数据。

定位

Seek 定位于当前文件指针;

SeekToBegin 定位当前文件指针到文件开头;

SeekToEnd 定位当前文件指针到文件尾;

GetLength 获取文件长度;

SetLength 改变文件长度。

封锁

LockRange 在文件中封锁一定范围内的字节;

UnlockRange 解锁一定范围内的字节。

状态

GetPosition 获取当前文件指针;

GetStatus 获取打开文件的状态;

GetFileName 获取被选文件的文件名;

GetFileTitle 获取被选文件的标题;

GetFilePath 获取被选文件的完整路径;

SetFilePath 设置被选文件的完整路径

静态

Rename 改名指定文件(静态函数);

Remove 删除指定文件(静态函数);

GetStatus 获取指定文件的状态(静态,虚函数); //注,此处错误:静态函数不会是虚函数了。

SetStatus 设置指定文件的状态(静态,虚函数) //同上

CFile操作详解

编辑

各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析。

文件的查找

当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。

CString strFileTitle;

CFileFind finder;

BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab");

while(bWorking)

{

bWorking=finder.FindNextFile();

strFileTitle=finder.GetFileTitle();

}

文件的打开/保存对话框

让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。

在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。

CFileDialog mFileDlg(TRUE,NULL,NULL,

OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,

"All Files (*.*)|*.*||",AfxGetMainWnd());

CString str(" ",10000);

mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);

str.ReleaseBuffer();

POSITION mPos=mFileDlg.GetStartPosition();

CString pathName(" ",128);

CFileStatus status;

while(mPos!=NULL)

{

pathName=mFileDlg.GetNextPathName(mPos);

CFile::GetStatus( pathName, status );

}

文件的读写

文件的读写非常重要,下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法:

//对文件进行读操作

char sRead[2];

CFile mFile(_T("user.txt"),CFile::modeRead);

if(mFile.GetLength()<2)

return;

mFile.Read(sRead,2);

mFile.Close();

//对文件进行写操作

TCHAR sWrite[]="这里写一窜包含中文的字符.abcd123";

BYTE sUNICODE={0xff,0xfe};

CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);

mFile.Write(sUNICODE,sizeof(sUNICODE)); //将文件变为UNICODE编码

mFile.Write(sWrite,sizeof(sWrite));

mFile.Flush();

mFile.Close();

注意:如果sWrite中没有中文等双字节字符,则就没有这样麻烦.

虽然这种方法最为基本,但是它的使用繁琐,而且功能非常简单。我向你推荐的是使用CArchive,它的使用方法简单且功能十分强大。首先还是用CFile声明一个对象,然后用这个对象的指针做参数声明一个CArchive对象,你就可以非常方便地存储各种复杂的数据类型了。它的使用方法见下例。

//对文件进行写操作

CString strTemp;

CFile mFile;

mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);

CArchive ar(&mFile,CArchive::store);

ar<<strTemp;

ar.Close();

mFile.Close();

//对文件进行读操作

CFile mFile;

if(mFile.Open("d:\\dd\\try.TRY",CFile::modeRead)==0)

return;

CArchive ar(&mFile,CArchive::load);

ar>>strTemp;

ar.Close();

mFile.Close();

CArchive的 << 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如:

//存储CAboutDlg类

ar.WriteClass(RUNTIME_CLASS(CAboutDlg));

//读取CAboutDlg类

CRuntimeClass* mRunClass=ar.ReadClass();

//使用CAboutDlg类

CObject* pObject=mRunClass->CreateObject();

((CDialog* )pObject)->DoModal();

虽然VC提供的文档/视结构中的文档也可进行这些操作,但是不容易理解、使用和管理,因此虽然很多VC入门的书上花费大量篇幅讲述文档/视结构,但我建议你最好不要使用它的文档。关于如何进行文档/视的分离有很多书介绍,包括非常著名的《Visual C++ 技术内幕》。

如果你要进行的文件操作只是简单的读写整行的字符串,我建议你使用CStdioFile,用它来进行此类操作非常方便,如下例。

CStdioFile mFile;

CFileException mExcept;

mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept);

CString string="I am a string.";

mFile.WriteString(string);

mFile.Close();

临时文件的使用

正规软件经常用到临时文件,你经常可以会看到C:\Windows\Temp目录下有大量的扩展名为tmp的文件,这些就是程序运行是建立的临时文件。临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名。得到此临时文件名以后,你就可以用它来建立并操作文件了,如:

char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];

GetTempPath(_MAX_PATH, szTempPath);

GetTempFileName(szTempPath,_T ("my_"),0,szTempfile);

CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite);

char m_char=‘a‘;

m_tempFile.Write(&m_char,2);

m_tempFile.Close();

文件的复制、删除等

MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它们的用法很简单,可参考MSDN。

1,判断文件是否存在

access(filename,mode);

2,对于不同用途又不同的文件操作,其中API函数CreateFile()也是比较有用处理方式,对于巨型文件很合适的其他的楼上的大都说了,不重复了.

[1]显示对话框,取得文件名

CString FilePathName;

CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为S***E AS对话框

if (dlg.DoModal() == IDOK)

FilePathName=dlg.GetPathName();

相关信息:CFileDialog 用于取文件名的几个成员函数:

假如选择的文件是C:\WINDOWS\TEST.EXE

则(1)GetPathName();取文件名全称,包括完整路径。取回C:\WINDOWS\TEST.EXE

(2)GetFileTitle();取回TEST

(3)GetFileName();取回TEST.EXE

(4)GetFileExt();取扩展名EXE

[2]打开文件

CFile file("C:\HELLO.TXT",CFile::modeRead);//只读方式打开

CFile::modeCreate 直接构造去创建一个新的文件如果这个文件存在,则删除这个文件里所有内容

CFile::modeNoTruncate 联合创建属性,如果这个文件已创建,则不删除原文件内容,因而这个文件是可以当做一个已经存在,或者不存在而被新建的文件来保证打开。这是非常有意义的,例如,打开来设置一个存在或者不存在的文件都是可以的。这个属性对于CStdioFile也是非常好的

CFile::modeRead 打开为只读属性.

CFile::modeWrite 打开为只写属性.

CFile::modeReadWrite 打开为读写属性.

CFile::modeNoInherit 防止这个文件来源于子进程.

CFile::shareDenyNone 在这个文件读写处理之外打开这个文件

CFile::shareDenyRead 以独占方式打开,拒绝其他读操作

CFile::shareDenyWrite 以独占方式打开,拒绝其他写操作

CFile::shareExclusive 以独占方式打开文件,拒绝其他读写操作访问这个文件Opens the file with exclusive mode, denying other 如果这个文件已打开进行读写操作则构造失败

CFile::shareCompat 这个属性在 32 bit MFC是不可用的. This flag maps to CFile::shareExclusive 当应用在CFile::Open.

CFile::typeText 设置文本模式特别处理回车换行 (used in derived classes only).

CFile::typeBinary 设置二进制模式(used in derived classes only).

例子:

{

CFile file;

file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);

.

.

.

}

[3]移动文件指针

file.Seek(100,CFile::begin);///从文件头开始往下移动100字节

file.Seek(-50,CFile::end);///从文件末尾往上移动50字节

file.Seek(-30,CFile::current);///从当前位置往上移动30字节

file.SeekToBegin();///移到文件头

file.SeekToEnd();///移到文件尾

[4]读写文件

读文件:

char buffer[1000];

file.Read(buffer,1000);

写文件:

CString string("自强不息");

file.Write(string,8);

[5]关闭文件

file.Close();

原文地址:https://www.cnblogs.com/oneway1990/p/8635053.html

时间: 2024-10-09 06:17:35

CFile CStdioFile CArchive 文件操作之异同(详细)的相关文章

CFileDialog 、CFile 如何进行文件操作 [转]

如何进行文件操作 [1]显示对话框,取得文件名 1 CString FilePathName; 2 CFileDialog dlg(TRUE);//TRUE为OPEN对话框,FALSE为SAVE AS对话框 3 if (dlg.DoModal() == IDOK) 4 FilePathName=dlg.GetPathName(); 相关信息:CFileDialog 用于取文件名的几个成员函数:假如选择的文件是C:\WINDOWS\TEST.EXE则 (1) GetPathName();   取文

文件操作

1.C文件操作 2.c++文件操作 3.MFC文件操作:CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作,并通过其派生类支持文本文件.内存文件和socket文件. Visual C++处理的文件通常分为两种: 文本文件:只可被任意文本编辑器读取ASCII文本. 二进制文件:指对包含任意格式或无格式数据的文件的统称. 1.定义文件变量 定义文件变量格式:CStdioFile 文件变量: 例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1; 2.打开指

VC++中文件操作(一)---CFileFind,CFileDialog,CFile,CArchive,CStdioFile

各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析. VC++中文件操作(一) ***************************************************************************××××××××××第一.V

C++ 文件操作(CFile类)

原文:文件操作(CFile),C吉羊 一.Visual C++编程文件操作 有如下方法可进行操作: (1)使用标准C运行库函数,包括fopen.fclose.fseek等. (2)使用Win16下的文件和目录操作函数,如lopen.lclose.lseek等.不过,在Win32下,这些函数主要是为了和Win16向后兼容. (3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等. Win32 下,打开和创建文件都由

ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path);与DirectoryInfo directory = new DirectoryInfo (Path);) 1获取文件信息 在知道文件相对路径的情形,下面代码可以获取文件的详细信息 1 public static void fileinfo(string Path) 2 { 3 Path = S

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

nodejs零基础详细教程2:模块化、fs文件操作模块、http创建服务模块

第二章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. 模块儿化  为什么需要模块儿化? 我们以前的常规js代码中,我们为了重用一些js代码,是将js方法封装起来,放到js文件中,然后在HTML页面中引入js,就可以在页面中使用这些方法了. 当这种直接引入和调用的方式存在一些不友好的地方,比如,

C语言文件操作函数大全(超详细)

C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,

文件操作类CFile

CFile file; CString str1= L"写入文件成功!"; wchar_t *str2; if (!file.Open(L"Hello.txt", CFile::modeReadWrite| CFile::modeRead)) { AfxMessageBox(L"打开文件失败!"); } wchar_t unicode = 0xFEFF; file.Write(&unicode, sizeof(wchar_t));//将文