对于文件操作,主要知识点经验总结如下。另外需注意C语言,C++语言对文件操作的不同规定及兼容性。
1.const char*, char*const的区别.看*和const谁离右边的定义指针名最近,*离得近的话表示该指针指向一个常量字符串,不能通过该指针改变字符串的内容;const离得近的话表示这是一个常量指针,指针指向的位置一开始就确定,不能改变。
2.file结构体。
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(应该是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
3.fopen函数。
函数原型:FILE * fopen(const char * path,const char * mode);
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
4.fwrite是C语言函数,指向文件写入一个数据块。
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
(1)buffer:是一个
指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的
数据项的个数;
(5)返回实际写入的数据项个数count。
5.fclose()函数就可以把
缓冲区内最后剩余的数据输出到内核缓冲区,并释放
文件指针和有关的缓冲区。
函数原型:int fclose( FILE *fp );
返回值:如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)
6.fflush()函数冲洗流中的信息,该函数通常用于处理磁盘文件。
int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset(
指针
偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,返回-1,且指向一个-1的位置,请小心使用。
fseek函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。
8.fread函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
函数原型
size_t fread ( void *
buffer
, size_t
size
, size_t
count
, FILE *
stream
) ;
参 数
buffer
size
count
要读count个数据项,每个数据项size个字节.
stream
输入流
返回值
实际读取的元素个数。如果返回值与
count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。
9.memset函数将s所指向的某一块内存中的前n个
字节的内容全部设置为ch指定的
ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的
指针。
void *memset(void *s, int ch,
size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的
结构体或
数组进行清零操作的一种最快方法
[1]
。
10. ftell函数用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
long
ftell(FILE *stream);
使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。
11.函数名: rewind()将文件内部的指针重新指向一个流的开头。
rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);
[1]
用 法: void rewind(FILE *stream);
12.itoa()与数字字符的关系,及48ASCII规则。
13.ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;
构造函数:ofstream(const char* szName,int nMode=ios::out,int nProt=filebut::openprot);
成员函数包括ofs.write, ofs.close(),
其头文件为fstream.h.
14.CreateFile函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
函数声明HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);
参数说明:
lpFileName String要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
dwDesiredAccess指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 。
dwShareModeLong, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功只要删除访问请求;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问;如果是FILE_SHARE_WRITE 随后打开操作对象会成功只有请求写访问。
lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDispositionLong,下述常数之一:
dwFlagsAndAttributesLong, 一个或多个下述常数
hTemplateFile,hTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到
lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。
如执行成功,则返回文件句柄。
15.WriteFile 函数。将数据写入一个文件。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、
套接字以及邮槽的处理。
BOOL
WriteFile(
HANDLE
hFile,
LPCVOID
lpBuffer,
DWORD
nNumberOfBytesToWrite,
LPDWORD
lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
vc返回值
调用成功,返回非0
调用不成功,返回为0
16.ReadFile函数。从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,
BOOL
ReadFile(
HANDLE
hFile,
LPVOID
lpBuffer,
DWORD
nNumberOfBytesToRead,
LPDWORD
lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
17.CFile是
MFC文件类的
基类,它直接提供非缓冲的二进制磁盘输入/
输出设备,并直接地通过
派生类支持文本文件和内存文件。MFC的类CFileDialog用于实现这种功能。
CFile与CArchive类共同使用,支持MFC对象的
串行化。该类与其派生类的层次关系让程序通过多形CFile接口操作所有文件对象。
使用CFile及其派生类进行一般目的的磁盘I/O,使用ofstream或其它Microsoft输入输出流类将格式化文本送到磁盘文件。
通常,一个磁盘文件在CFile构造时自动打开并在析构时关闭。静态成员函数使你可以在不打开文件的情况下检查文件状态。
用前包含头文件 #include <afx.h>
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
第一个参数为指定文件的名字,第二个参数为指定文件共享和访问的方式。
数据成员
m_hFile 常包含操作系统文件句柄
构造函数
CFile 从一个路径或文件句柄构造一个CFile对象;
Open 带错误检验选项,安全打开一个文件;
Close 关闭文件,删除对象。
输入/输出
Read 从文件的当前位置读数据;
ReadHuge 可从文件的当前位置读取大于64K数据,在32位编程中废弃了,见Read;
WriteHuge 可将文件的大于64K数据写到当前文件位置,在32位编程中废弃了,见Write;
Flush 溢去未被写入的任何数据。
定位
SeekToBegin 定位当前文件指针到文件开头;
SeekToEnd 定位当前文件指针到文件尾;
SetLength 改变文件长度。
封锁
UnlockRange 解锁一定范围内的字节。
状态
GetPosition 获取当前文件指针;
GetStatus 获取打开文件的状态;
GetFilePath 获取被选文件的完整路径;
SetFilePath 设置被选文件的完整路径
静态
GetStatus 获取指定文件的状态(静态,虚函数); //注,此处错误:静态函数不会是虚函数了。
SetStatus 设置指定文件的状态(静态,虚函数) //同上
18.CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
bOpenFileDialog
TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。
lpszDefExt
指定默认的文件扩展名。
lpszFileName
指定默认的文件名。
dwFlags
指明一些特定风格。
lpszFilter
是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。
pParentWnd
为父窗口指针。
构造函数
CFileDialog构造一个CFileDialog对象操作
GetFileExt返回选定文件的扩展文件名
GetNextPathName返回下一个选定文件的完整路径
GetReadOnlyPref返回选定文件的只读状态
GetStartPosition返回文件名列表的第一个元素位置
19.win.ini,是Windows系统的一个基本系统配置文件。WIN.INI文件包含若干小节,每一节由一组相关的设定组成。文件配保存了诸如影响Windows操作环境的部分、控制系统界面显示形式及窗口和鼠标器的位置、联结特定的文件类型与相应的应用程序、列出有关HELP窗口及对话窗的默认尺寸、布局、文本颜色设置等等的选项。是系统配置不可缺少的文件。
WIN.INI文件包含若干小节,每一节由一组相关的设定组成。WIN.INI文件中小节和设定的格式如下:
[小节名]
关键字名=值
其中:小节名必须用中括号([])括起,且左括号必须在屏幕的最左一列,文件中可以包含注释,每一行注释以分号(;)开始。
WIN.INI中的主要小节名及含义如下:
[Windows]:影响Windows操作环境的部分,包括在启动Windows时执行哪一个应用程序,警告声音的设置、窗口边框的宽度、键盘响应的速度、鼠标器设置以及将文件定义为文档或程序等。
[Desktop]:控制系统界面显示形式及窗口和鼠标器的位置。
[Extensions]:联结特定的文件类型与相应的应用程序。
[Intl]:描述怎样为除美国外的其它国家显示有关的文件项目。
[Windows Help]:列出有关HELP窗口及对话窗的默认尺寸、布局、文本颜色等设置。
[Font Substitue]:列出Windows可识别的互换字体。
[Sounds]:为每个系统事件设计的声音文件列表。
[MCI Extensions]:把MEDIA控制接口设备同特定文件类型联系起来。
[Compatibility]:用于解决Windows 98和Windows 3.x之间的差异所引起的兼容性问题。
[Compatibility32]:用于解决Windows 98和Windows 3.X之间的差异所引起的32位磁盘存取兼容性问题。
[MCI Compatibility]:用于Windows 98中文版的MCI设备兼容性问题。
[Module Compatibility]:用于Windows 98中文版的模块兼容性问题。
[IME Compatibility]:用于Windows 98中文版的输入法与应用程序的兼容性问题。
[Pscript.Drv]:描述PostScrip打印机的ATM字库状况。
[Fonts]:描述Windows装入的屏幕字体文件。
Embedding:列出目标联接与嵌入(OLE)使用的服务器目标。
[Colors]:定义Windows的显示颜色。
[PrinterPorts]:Windows将要访问的激活或非激活的输出设备。
[Ports]:描述中文Windows 98的可用端口。
[Mail]:描述Microsoft Mail以及Microsoft Exchange的使用参数。
[Devices]:与旧版本Windows的应用程序兼容的激活输出设备。
[Programs]:当用户打开多个数据文件时,该段可为Windows查找相应程序文件提供附加的路径。
[Associated CharSet]:描述Windows 98中文版使用字符集状态和西文字体所对应的缺省中文字体。
[Windows Telephony]:描述Windows 98中文版的Microsoft Exchange的电话号码初始化日期和时间。
[Paintbrush]:描述Windows 98中文版的“画图”(PaintBrush)的省略图片格式。
[MAPI 1.0 Time Zone]:描述MAPI 1.0的时区设置参数.
20.writeprofilestring()。在Win.ini初始化文件指定小节内设置一个字串。
把信息写入系统的win.ini文件。
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,也可使用相对
//路径,否则需要给出绝度路径。
)
21.从系统的win.ini文件中读取信息
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
22.RegCreateKey 。创建或打开注册表项。默认为创建,当注册表中有此项时。为打开。
LONG RegCreateKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);
hKey 指向当前打开表项的句柄,或者是下列预定义保留句柄值之一,实际上就是注册表中的几个分支。
lpSubKey 指向一个空终止的字符串指针,指示这个函数将打开或创建的表项的名称。这个表项必须是由hKey参数所标识的项的子项.
phkResult 这是一个返回值,指向一个变量的指针,用来接受创建或打开的表项的句柄。当不再需要此返回的注册表项句柄时,调用RegCloseKey函数关闭这个句柄。
23.RegOpenKey.打开一个现有的注册表项.
LONG RegOpenKey(
HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址);
);
24.RegSetValue设置指定项或子项的默认值 .
LONG RegSetValue(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD dwType,
LPCTSTR lpData,
DWORD cbData
);
hKey
|
指向当前打开表项的句柄,或者预定保留值之一(
注册表中默认的几大
注册表项)
|
lpSubKey
|
指向一个空终止的字符串指针,指示这个函数将打开或创建表项的名称。可以为NULL,或
空字符串,那么此函数将为参数hkey所指定的注册表项默认设置值。这个表项必须是由hkey参数所标识的子项。
|
dwType
|
指示将被存储的信息类型。该参数必须为REG_SZ
|
lpData
|
指向一个空终止的字符串,该字符串中包含了
要为指定项的默认值设置的数据。
|
cbData
|
指示lpData参数所指向的字符串的大小,单位是字节,但不包含字符串最后的空终止字符
|
25.RegQueryValue函数.取得指定项或子项的默认(未命名)值.