孙鑫老师第十二课文件操作的读书笔记

本文介绍了多种编程语言中文件的读写操作方法,包括C、C++、WIN32 API及MFC库等,并详细解释了各种模式下的操作细节。此外还介绍了如何通过Windows API对注册表进行创建、设置和查询键值等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、关于指向指向常量的指针与常量指针
1.const关键字修饰变量类型。
char ch[5]="lisi";
const char *pStr=ch;
表示指向的对象是常量,对象值不可改变,但是指针值可以修改。
*pStr="ddd"//错误
pStr="ddd"//正确

2.指针常量
char ch[5]="lisi"
char *const pStr=ch;
指向的对象的内容可以改变,但是指向的对象不能修改
pStr="ddd"//错误
*pStr="ddd"//正确

二、文件读写
(一)C语言中文件的读写
1.FILE *fopen( const char *filename, const char *mode );
打开文件,第一个参数是要打开的文件名,第二个参数是打开的模式,常用的是r,r+,w,w+,a,a+。其中,r,r+所打开的文件必须是已经存在的文件,r+还可以对文件进行写操作。w,w+如果文件已存在的话,会先销毁,w+还可以进行读操作。a,a+如果文件不存在的话,先创建,如果文件存在的话,会在原文件末尾进行追加,a+还可以进行读操作。

2.size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
第一个参数是要写入的内容,第二个是要写入的项的大小,第三个参数是要写入项的最大数目,第四个参数是要写入的文件结构体指针。

3.fclose(FILE *stream)表示文件操作结束。这是系统会将文件缓冲区的文件读入或者写入磁盘。但是如果在此函数之后还想再对该文件进行操作时,就必须再打开一个文件了。

4.fflush(FILE *stream)刷新缓冲区。让缓冲区的数据写入到磁盘。

5.int fseek(FILE *stream,long offset,int origin)移动文件指针,成功返回0。第一个参数是文件结构指针,第二个参数是从origin处的偏移字节,第三个参数是文件的开始位置(SEEK_CUR、SEEK_END、SEEK_SET)。

6.size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
第一个参数是要存放要读入的内容,第二个是要写入的项的大小,第三个参数是要写入项的最大数目,第四个参数是要写入的文件结构体指针。

7.long ftell( FILE *stream )获取文件当前的位置,这也主要看当前文件的指针在哪,可以通过fseek来指定。

8.void rewind( FILE *stream )将文件指针重新放到文件的开始处。

9.注意文件以t及b方式读的时候是很不同的。也就是说读入和写入时方式要一致。写入时是b,读时也要是b。

(二)C++中文件的读写(包含fstream.h)
1.C++对文件进行写操作是使用ofstream类
ofstream( const char* szName, int nMode = ios::out, int nProt = filebuf::openprot );第一个参数是文件名,第二个是文件写入方式,第三个是文件打开的保护形式。

2.ostream::write(const char* pch, int nCount),第一个参数是要写入的字符串,第二个参数是要写入的字符串的长度。

3.C++对文件进行读操作时使用ifstream类。

(三)WIN32中对文件的读写
1.打开文件
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDispostion ,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);

2.写入数据
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);

3.在对文件写操作完成之后可调用CloseHandle()关闭句柄。

4.读取文件
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped);

(四)使用MFC的CFile类来读写文件
1.构造一个CFile对象
CFile( LPCTSTR lpszFileName, UINT nOpenFlags );

2.读文件
virtual void Write( const void* lpBuf, UINT nCount );


(五)建立打开和保存对话框
1.利用CFileDialog的构造函数
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );第一个参数TRUE构造一个打开对话框,FALSE为保存对话框

2.这个类中有一个m_ofn成员变量,这个变量是OPENFILENAME结构体的,此结构体具体的成员如下:
typedef struct tagOFN {
  DWORD         lStructSize;
  HWND          hwndOwner;
  HINSTANCE     hInstance;
  LPCTSTR       lpstrFilter; //过滤器
  LPTSTR        lpstrCustomFilter;
  DWORD         nMaxCustFilter;
  DWORD         nFilterIndex;
  LPTSTR        lpstrFile;
  DWORD         nMaxFile;
  LPTSTR        lpstrFileTitle;
  DWORD         nMaxFileTitle;
  LPCTSTR       lpstrInitialDir;
  LPCTSTR       lpstrTitle; //对话框标题
  DWORD         Flags;
  WORD          nFileOffset;
  WORD          nFileExtension;
  LPCTSTR       lpstrDefExt; //默认的扩展名
  LPARAM        lCustData;
  LPOFNHOOKPROC lpfnHook;
  LPCTSTR       lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;

(六)对win.ini文件的写入与读取
1.写入
BOOL WriteProfileString(
  LPCTSTR lpAppName, // section name
  LPCTSTR lpKeyName, // key name
  LPCTSTR lpString   // string to write
);

2.读取
DWORD GetProfileString(
  LPCTSTR lpAppName,        // section name
  LPCTSTR lpKeyName,        // key name
  LPCTSTR lpDefault,        // default string 这个参数一定不为空
  LPTSTR lpReturnedString,  // destination buffer
  DWORD nSize               // size of destination buffer
);

二、对注册表的编程
1.创建一个指定的注册表项,如果已存在,则打开它。
LONG RegCreateKey(
  HKEY hKey,        // handle to an open key
  LPCTSTR lpSubKey, // subkey name
  PHKEY phkResult   // buffer for key handle
);

2.设置键值
LONG RegSetValue(
  HKEY hKey,         // handle to key
  LPCTSTR lpSubKey,  // subkey name
  DWORD dwType,      // information type
  LPCTSTR lpData,    // value data
  DWORD cbData       // size of value data
);

3.查询键值
LONG RegQueryValue(
  HKEY hKey,        // handle to key to query
  LPCTSTR lpSubKey, // subkey name
  LPTSTR lpValue,   // string buffer
  PLONG lpcbValue   // size of returned string
);

4.设置键值(可以设置不同类型的键值)
LONG RegSetValueEx(
HKEY hKey,
LPCWSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE *lpData,
DWORD cbData );

5.对其他类型键值进行读取
(1)首先要使用RegOpenGKey()打开指定注册表项。
(2)使用RegQueryValueEx()来读取。

三、其他
1.size_t其实就是无符号的整型数。
2.void*memset(void*dest,int c,size_t count),用指定字符来设置一块内存区。
3.0对应的ASCII码是48。48~57的ASCII码对应0~9。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值