一、关于指向指向常量的指针与常量指针
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。