CStdioFile的用法详细解析

关于CStdioFile
CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开的C 运行时流式文件。

流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。

CStdioFile 不支持Duplicate,LockRange,和UnlockRange 这几个CFile 函数。如果在CStdioFile 中调用了这几个函数,将会出现CNoSupported 异常。
CStdioFile::ReadString(LPTSTR lpsz, UINT nMax);

读取一行文本到缓冲区,遇到“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,遇到回车换行符停止读取。回车和换行符不读到rString,而且末尾也没有添加“\0”。
CStdioFile::WriteString( LPCTSTR lpsz );(不支持CString直接写入)

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

CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。

比如:写入文件的例子


代码如下:

//创建文件
CStdioFile file;
file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
//写入文件
CString str;
str.Format("%s\r\n","hello!I am talkingmute!");
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();

CStdioFile类的声明保存再afx.h头文件中。
CStdioFile类不支持CFile类中的Duplicate、LockRange、UnlockRange函数,如果你使用了,会得到CNotSupportedException类的错误。
CStringFile类默认的是按照Text模式操作文件。CFile 类默认的是按照二进制模式操作文件。

这里大致说明一下二进制模式和Text模式的区别。
二进制模式:
对于一行的结尾我们必须输入”\r\n”,才能表示回车换行的效果。

Text模式:”\r”回车的工作是自动完成的,我们只需要写入”\n”即可。所以我们再使用文本模式时要主要,当我们从外部读入文件时,”\r\n”会被翻译成”\n”,写入文件时,我们对于回车换行只需提供”\n”,即可,”\r\n”会被写入到文件中。
m_pStream成员变量:
打开文件的指针。

构造函数:
CStdioFile();
CStdioFile(FILE *pOpenStream);
CStdioFile(LPCTSTR lpFileName, UINT nOpenFlags);
throw(CFileException);

FILE *pOpenStream:指的是c运行函数fopen调用后返回的文件指针。
LPCTSTR lpFileName:指的是被打开的文件(绝对地址或相对地址)
UINT nOpenFlags:指的是CFile类中所描述的打开文件的方式。

virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
throw(CFileException);

如果使用该函数读取文本文件,当遇到”\r\n”,停止读取,并去掉”\r”,保留”\n”,并在字符串尾部增加”\0”,nMax的长度包含有”\0”字符,

实际的分析如下:
如果nMax <= 字符数,读取(nMax-1)个字符+0x00;
如果nMax = 字符数 + 1,读取nMax个字符+0x00;
如果nMax > 字符数,读取nMax个字符+0x0A(”\n”) + 0x00;
如果文件有多行,则当文件没有读完时,返回NOT NULL,读到文件尾,返回NULL。

BOOL ReadString(CString& rString);
throw(CFileException);

读取一行文本到rString中,遇到回车换行符停止读取,回车和换行符均不读到rString中,尾部也不添加”0x00”。
如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE。

virtual void WriteString(LPTSTR lpsz);
throw(CFileException);

将缓冲区中的数据写入到与CStdioFile对象相关联的文件中,不支持CString类型数据写入,结束的”\0”不被写入到文件中,lpsz缓冲区中的所有

(0)

相关推荐

  • VC++实现通过API来查看程序错误信息的方法

    本文实例介绍了VC++通过API查看错误信息的方法,可以在遇到错误的时候,将显示出错信息并退出处理,具体的实现代码如下: if((m_hBitMap=(HBITMAP)::LoadImage(NULL,filepath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE))==NULL) { LPVOID lpMsgBuf; DWORD dw = ::GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOC

  • VC++创建msi文件的方法

    采用VC++可以编写自己软件的安装程序.这里只是创建安装程序类型的msi文件,用orca打开是正确的文件格式,值得自己记录一下了,msi数据库里面的各种表关系复杂,不是一时半刻能研究清楚的.本文仅作一浅析,实现写一个程序附到软件程序的后面,这样可以在编译完成后直接会有安装程序msi文件.就像平常下载的软件,可以写注册表,创建桌面快捷方式,注册各种软件用到的组件和功能. 具体示例程序如下: #pragma once //CRT headers. #include <TCHAR.H> //wind

  • VC++简单实现关机、重启计算机实例代码

    本文以一个实例形式介绍了VC++简单实现关机.重启计算机的方法,代码比较实用,有一定的参考价值.完整实例代码如下: void CWebBrowserView::OnMenuShutdown() { // TODO: 在此添加命令处理程序代码 if (AfxMessageBox("确定要关机吗?",MB_YESNO) == IDYES) { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. if (

  • CFile与CStdioFile的文件读写使用方法详解

    CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite); 文件打开模式可组合使用,用"|"隔开,常用的有以下几种:CFile::modeCreate:以新建方式打开,如果文件不存在,新建:如果文件已存在,把该文件长度置零,即清除文件原有内容. CFile::modeNoTruncate:以追加方式打开

  • vc++实现的tcp socket客户端和服务端示例

    Tcp Server 复制代码 代码如下: #include <WinSock2.h>#include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(){ // initial socket library WORD wVerisonRequested; WSADATA wsaData; int err; wVerisonRequested = MAKEWORD(1, 1); err = WSASta

  • VC++实现CStdioFile写入及读取文件并自动换行的方法

    本文所述CStdioFile可实现在VC++中主要用来写入及读出文件的功能,继承自CFile类,它会自动处理 "\r\n",遇到"\n"自动添加\r并设置光标在当前行,它同时可以自动换行,不过使用CStdioFile在处理大文件时速度有些慢, 用CStdioFile写入读取文件实现代码如下: LPTSTR filter=_T("Playlist Files(.txt)|*.txt|"); CString tempPath; CFileDialog

  • VC++实现程序开机启动运行的方法

    本文所述实例主要介绍如何在VC++下让程序开机自动运行的方法.一般而言添加到开机启动项,这是很多程序都有的做法,具体实现思路是利用win.in文件实现相关程序的开机自动启动.主要是通过WritePrivateProfileString函数来实现.下面来看这一功能的实现方法. 主要功能代码如下: HCURSOR CAutoRunDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CAutoRunDlg::OnBrowse() { //

  • VC++实现输出GIF到窗体并显示GIF动画的方法

    本文讲述了VC++在窗体中显示GIF动画的方法,这是主要代码部分,在这段代码中,VC++将使用GDI技术加载GIF图像,定义GUID数组.定义指针.初始化各成员变量.释放属性对象.释放GUID等资源等. 代码如下: //加载GIF文件 void COutputGIFDlg::OnBrowse() { CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "GIF|*.

  • VC++操作SQLite简单实例

    对于很多程序员来说,SQLite并不陌生.SQLite 是一款主要用于嵌入式的开源数据库,可集成在自己的桌面程序中,也可替代Access作为后台数据库.SQLite 支持多数SQL92标准,例如:索引.限制.触发和查看支持,支持 NULL.INTEGER.REAL.TEXT 和 BLOB 数据类型,支持事务.以下是一些SQLite的简单使用. //建立数据库 C:\sqlite-3_6_11> sqlite3.exe dbname.db 建立数据库的时候sqlite3.exe后面跟数据库文件名

  • VC++的combobox控件用法汇总

    在VC++程序设计中,combobox控件是再普通不过的窗体元素控件了,而对于新手来说,掌握combobox 的各种用法显得尤其重要,本文就来总结一些实用的combobox控件用法,供大家参考. 一.添加/删除Combo Box内容: 1. 一般是在ComboBox控件属性的Data标签里添加,一行表示ComboBox下拉列表中的一行,换行用ctrl+回车. 2. 在程序初始化时动态添加,如:控件内容初始化: CString strTemp; ((CComboBox*)GetDlgItem(ID

  • VC++角色游戏中的人物初始化模块代码实例

    本文以一个实例讲述VC++游戏中的人物角色动画初始化实现代码,本代码只是实现人物角色动画的初始化,不包括其它功能,并不是完整的一个游戏应用,现在将这个角色初始化代码与大家分享.希望能够对大家学习VC++有所帮助. #include "StdAfx.h" #include "Character.h" CCharacter::CCharacter(void) { } CCharacter::~CCharacter(void) { } //初始化人物 bool CChar

  • VC++基于Dx实现的截图程序示例代码

    本文所述的程序示例为VC++图象特效的截图示例,需要DirectX 3.0以上版,代码中的GetScreen函数是本截图程序的关键.运行这个程序可用Esc键结束.代码中需要ddutil.h与ddutil.cpp文件,请自行下载添加.关于InitDDraw()函数,功能是初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区),以及创建一个定时器. 具体的功能代码如下: #include <windows.h> #include <windowsx.h> #include

随机推荐