1、在C语言中,对于文件的操作是利用FILE结构体进行的
1> C语言对文件的操作使用了缓冲文件系统
2> rewind函数:该函数的功能是将文件文件指针重新放置到文件的开始出,eg:rewind(pFile);此功能也可用fseek实现,eg: fseek(pFile, 0, SEEK_SET);
3> fopen函数:FILE *fopen(const char *filename, const char *mode);
4> fwrite函数:文件的写入,size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
5> fclose函数:关闭文件,表示对文件的写入操作已经完成
6> fflush函数:刷新缓冲区,将缓冲区的数据写入磁盘文件中
7> fseek函数:文件指针定位,int sfeek(FILE* stream, long offset, int origin);
8> fread函数:文件的读取,size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
9> ftell函数:获取文件指针的当前位置,long ftell(FILE* stream);可以用此函数获取文件的长度:
eg: fseek(pFilem 0, SEEK_END); //将文件指针移动到文件尾
int len=ftell(pFile);
10>在读取文件内容时,应正确地设置文件指针的位置。在对文件进行操作时,移动文件指针后经常会犯一个错误:在我们将文件指针移动到文件结尾后,再次读取文件时,就是从文件指针指向的下一个写入位置处开始读取,而此时文件指针已经到了文件结尾,当然是读取不到数据的。
11>
eg:
1> 文件的写入
void CFileOperateView::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
FILE *pFile=fopen("1.txt", "w");
//FILE* pFile;
//fopen_s(&pFile, "1.txt", "w");
fwrite("http://www.sunxin.org", 1, strlen("http://www.sunxin.org"), pFile);
fflush(pFile);
fseek(pFile, 0, SEEK_SET);
fwrite("welcom", 1, strlen("welcom:"), pFile);
fclose(pFile);
}
2> 文件的读取
void CFileOperateView::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
FILE *pFile=fopen("1.txt", "r");
char ch[100];
memset(ch, 0, 100); //解决'/0'结尾的一种途径
fread(ch, 1, 100, pFile);
fclose(pFile);
CString str(ch); //可直接将此行和下一行合并成:MessageBox(CString(ch));
MessageBox(str); //不要直接用MessageBox(ch);
}
2、C语言中默认以文本文件方式打开文件。
1> 文件只是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。对于文本文件来说,它只是一种特殊形式的文件。
所存放的每一个字节都可以转换为一个可读的字符。
2> 写入和读取文件时要保持一致。如果采用文本方式写入,应采用文本方式读取;如果采用二进制方式写入数据,在读取时也应采用二进制方式。
3> 不管文本文件,还是二进制文件,如果统一采用二进制方式进行写入和读取,则是不会出错的。因为这种读取和写入是严格按照一个字节一个字节地进行的。
4> 不管是文本文件和二进制文件,都可以采用二进制方式或文本方式打开,然后进行写入或读取。但是,对于二进制文件来说,如果以文本方式读取时,可能会出现一些问题。如位图文件可能有很多13、10组合,如果以文本方式读取的话,就会把这些组合转换为换行符:10,从而导致位图数据失。
3、C++对文件操作的支持:
#include <fstream>
1> 文件的写入
void CFileOperateView::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
std::ofstream ofs("4.txt"); //using 指示
ofs.write("abc", strlen("abc"));
ofs.close();
}
2> 文件的读取
void CFileOperateView::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
std::ifstream ifs("4.txt"); //using 指示
char ch[100];
memset(ch, 0, 100);
ifs.read(ch, 100);
ifs.close();
MessageBox(CString(ch));
}
4、Win32 API对文件操作的支持
1> 文件的写入
void CFileOperateView::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
HANDLE hFile;
hFile=CreateFile(_T("5.txt"), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwWrites;
WriteFile(hFile, "abc", strlen("abc"), &dwWrites, NULL);
CloseHandle(hFile);
}
2> 文件的读取
void CFileOperateView::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
HANDLE hFile;
hFile=CreateFile(_T("5.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
char ch[100];
DWORD dwReads;
ReadFile(hFile, ch, 100, &dwReads, NULL);
ch[dwReads]=0;
CloseHandle(hFile);
MessageBox(CString(ch));
}
注:CreateFile函数将创建或打开一个对象,并返回一个用于读取该对象的句柄。
5、MFC对文件操作的支持:MFC中提供的支持文件操作的基类是CFile,该类提供了没有缓存的二进制格式的磁盘文件输入输出功能,通过其派生类
能够间接支持文本文件和内存文件。
1> 文件的写入
void CFileOperateView::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
CFile file(_T("6.txt"), CFile::modeCreate | CFile::modeWrite);
file.Write("abc", strlen("abc"));
file.Close();
}
2> 文件的读取
void CFileOperateView::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
CFile file(_T("6.txt"), CFile::modeRead);
DWORD dwFileLen=file.GetLength();
char* pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf, dwFileLen);
file.Close();
MessageBox(CString(pBuf));
}
6、保存对话框和打开对话框
1> 保存对话框
void CFileOperateView::OnFileWrite()
{
// TODO: 在此添加命令处理程序代码
CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle=_T("我的文件保存对话框"); //改变对话框的标题
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.txt)/0*.txt/0All Files(*.*)/0*.*/0/0"); //设置过滤器
fileDlg.m_ofn.lpstrDefExt=_T("txt"); //设置默认扩展名
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
file.Write("abc", strlen("abc"));
file.Close();
}
}
2> 打开对话框
void CFileOperateView::OnFileRead()
{
// TODO: 在此添加命令处理程序代码
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle=_T("我的文件打开对话框");
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.txt)/0*.txt/0All Files(*.*)/0/0");
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(), CFile::modeRead); //GetFileName()获取用户输入的文件名
DWORD dwFileLen=file.GetLength();
char* pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf, dwFileLen);
file.Close();
MessageBox(CString(pBuf));
}
}
注:保存和打开对话框都是由CFileDialog创建的,若其构造函数的参数设为FALSE,则创建保存对话框;若设为TRUE,则创建的是打开对话框。
CFileDialog类有一类型为OPENFILENAME的结构体/数据成员m_ofn,可在其中修改对话框的一些特征。
为了获取用户输入的文件名,CFileDialog类提供了两个函数:GetPathName和GetFileName。其中GetpathName返回选择文件的完整路径;GetFileName返回选择文件的文件名。
6、XP下注册表文件操作:
1> 注册表写入:(使用CWinApp::WriteProfileStringW)
在app类中的InitInstance函数中添加代码:
在代码:SetRegistryKey(_T("应用程序向导生成的本地应用程序"));后面添加以下代码:
this->WriteProfileStringW(_T("newAdd"), _T("newItem"), _T("value"));
2> 注册表读取:(使用CWinApp::GetProfileStringW)
在同样的位置添加代码:
CString str=this->GetProfileStringW(_T("newAdd"), _T("newItem"));
AfxMessageBox(str);
3> 注册表删除:(使用CWinApp提供的函数)
1)删除键(项):this->WriteProfileStringW(_T("newAdd"), _T("newItem"), NULL); //将待删键的键值设为NULL
2)删除段:this->WriteProfileStringW(_T("newAdd"), NULL, NULL); 将待删段的键名设为NULL
注:F5刷新注册表
7、Win32 API注册表操作:Win32 API提供了大量的函数以便应用程序访问注册表,这些函数一般以Reg开头
1> RegCreateKey函数:创建键,该函数将创建指定的注册表项
2> RegOpenKey函数:打开键,该函数将打开指定的注册表项。在可以处理注册表之前,需要打开注册表中的一个键
3> RegSetValue函数:写入注册表,该函数可以设置指定注册表项的默认值或者未命名值的数据。
在注册表中,对值来说,包含三个部分:值名称、值类型和值本身
RegSetValueEx函数:该函数将在注册表项下设置指定值的数据和类型。
4> RegQueryValue函数:从注册表中读数据,该函数可以获得指定注册表项默认的值或未命名的值的相关数据。
注:在向注册表中写入软件信息时,通常都是在HKEY_LOCAK_MACHINE分支下写入的。