Windows编程中各种操作文件的方法
windows编程中文件操作有以下几种常见方法:
1.C语言中文件操作。
2.C++语言中的文件操作。
3.Win32 API函数文件操作。
4.MFC CFile类文件操作。
5.MFC CFileDialog类的文件操作。
6.注册表文件操作。
下面我来详细说明一下各种文件操作方法:
1. C语言中文件操作.需要包含的头文件stdio.h
写入文件:
FILE *pfile=fopen("C.txt","w");//以写的方式打开C.txt文件。
fwrite("Welcome to VCFans!",1,strlen("Welcome to VCFans!"),pfile);//将数据写入文件。
fflush(pfile);//刷新缓冲区。将缓冲区数据写入文件
fclose(pfile);//关闭文件
读取文件:
FILE *pfile=fopen("C.txt","r");//以读的方式打开C.txt文件。
char FileContent[100];
memset(FileContent,0,100);//初始化FileContent
fread(FileContent,1,100,pfile);//将刚才C.txt文件中的内容读入到FileContent
MessageBox(FileContent);//输出结果
fclose(pfile);//关闭文件
2.C++语言中的文件操作。需要包含的头文件fstream.h
写入文件:
ofstream ofs("C++.txt");//建立ofstream对像。
ofs.write("Welcome to VCFans!",strlen("Welcome to VCFans!"));//将数据写入文件
ofs.close();//关闭ofstream对象。
读取文件:
ifstream ifs("C++.txt");
char FileContent[100];
memset(FileContent,0,100);//初始化FileContent
ifs.read(FileContent,100);//读取数据
ifs.close();//关闭ifstream对像
MessageBox(FileContent);//输出结果
3.Win32 API函数文件操作。需要包含的头文件winbase.h,需要类库:kernel32.lib
写入文件:
HANDLE hFile;//定义一个句柄。
hFile=CreateFile("API.txt",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);//使用CreatFile这个API函数打开文件
DWORD Written;
WriteFile(hFile,"Welcome to VCFans!",strlen("Welcome to VCFans!"),&Written,NULL);//写入文件
CloseHandle(hFile);//关闭句柄
读取文件:
HANDLE hFile;//定义一个句柄。
hFile=CreateFile("API.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);//使用CreatFile这个API函数打开文件
DWORD dwDataLen;
char FileContent[100];
ReadFile(hFile,FileContent,100,&dwDataLen,NULL);//读取数据
FileContent[dwDataLen]=0;//将数组未尾设零。
CloseHandle(hFile);//关闭句柄
MessageBox(FileContent);//输出结果
4.MFC CFile类文件操作。需要包含的头文件afx.h
写入文件:
CFile file("CFile.txt",CFile::modeCreate| CFile::modeWrite);//构造CFile对象
file.Write("Welcome to VCFans !",strlen("Welcome to VCFans !"));//写入数据到文件
file.Close();//关闭CFile对象。
读取文件:
CFile file("CFile.txt",CFile::modeRead);//构造CFile对象
char FileContent[100];
memset(FileContent,0,100);//初始化FileContent
file.Read(FileContent,100);//读入数据
file.Close();//关闭文件对象
MessageBox(FileContent);//输出数据
5.MFC CFileDialog类的文件操作。需要包含的头文件Afxdlgs.h
写入文件:
CFileDialog fileDlg(FALSE,"txt","CFileDialog.txt");//建立CFileDialog对象
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(),CFile::modeCreate| CFile::modeWrite);//构造CFile对象
file.Write("Welcome to VCFans !",strlen("Welcome to VCFans !"));//写入数据到文件
file.Close();
};
读取文件:
CFileDialog fileDlg(TRUE,"txt","CFileDialog.txt");//建立CFileDialog对象
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(),CFile::modeRead);//构造CFile对象
char FileContent[100];
memset(FileContent,0,100);//初始化FileContent
file.Read(FileContent,100);//读入数据
file.Close();//关闭文件对象
MessageBox(FileContent);
};
6.注册表文件操作。
写入注册表:
HKEY hKey;
DWORD dwSex=1;
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\vcfans\reg",&hKey);//打开注册表键
RegSetValueEx(hKey,"sex",0,REG_DWORD,(CONST BYTE*)&dwSex,4);//写入注册表数据
RegCloseKey(hKey);//关闭注册表键
读注册表:
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\vcfans\reg",&hKey);//打开注册表键
DWORD dwType;
DWORD dwValue;
DWORD dwSex;
RegQueryValueEx(hKey,"sex",0,&dwType,(LPBYTE)&dwSex,&dwValue);//查询注册表数据
RegCloseKey(hKey);//关闭注册表键
CString str;
str.Format("sex=%d",dwSex);
MessageBox(str);
上面介绍了Windows编程中各种操作文件的方法,如果是多线程操作文件的话,就必须做对文件操作的安全保障,防止对文件资源的恶性竞争。下面这个列子做了一个简单的文件读写保护。
#include "iostream" #include "string.h" #include usingnamespace std; class FileLog { private: CRITICAL_SECTION cs; HANDLE fileHandle; void Lock() { EnterCriticalSection(&cs);// 进入临界区 } void UnLock() { LeaveCriticalSection(&cs);//离开临界区 } public: FileLog() { InitializeCriticalSection(&cs);//初始化临界区 fileHandle=INVALID_HANDLE_VALUE;//先初始化为错误的句柄 } ~FileLog() { if(fileHandle!=INVALID_HANDLE_VALUE) { //CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄 CloseHandle(fileHandle); } DeleteCriticalSection(&cs);//删除临界区 } BOOL Open(constchar*fileName);//打开文件 FileLog& Write(constchar*content);//向文件中写入内容 FileLog& WriteLine(constchar*content);//向文件中写入内容 BOOL Read(char*buf,int size);//读文件内容 BOOL Close();//关闭文件 };#include "stdafx.h" #include "FileLog.h" //打开文件 BOOL FileLog::Open(constchar*fileName) { if(fileHandle==INVALID_HANDLE_VALUE) { fileHandle=CreateFile(fileName,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(fileHandle!=INVALID_HANDLE_VALUE) { SetFilePointer(fileHandle,0,NULL,FILE_END); return TRUE; } } return FALSE; } //写文件 返回当前对象的引用,实现连接操作 FileLog& FileLog::Write(constchar*content) { Lock(); if(fileHandle!=INVALID_HANDLE_VALUE) { DWORD dwSize=0; WriteFile(fileHandle,content,strlen(content),&dwSize,NULL);//写 } //开始的时候少写了这句,由于加的锁没有释放,一个线程占用之后,导致其他线程只能一直等待,好久都没有找到原因。 UnLock(); return*this; } //写入一行 FileLog& FileLog::WriteLine(constchar*content) { Lock(); if(fileHandle!=INVALID_HANDLE_VALUE) { DWORD dwSize=0; WriteFile(fileHandle,content,strlen(content),&dwSize,NULL);//写 } UnLock(); return FileLog::Write(" "); } //读文件内容 BOOL FileLog::Read(char*buf,int size) { BOOL isOK=FALSE; Lock(); if(fileHandle!=INVALID_HANDLE_VALUE) { DWORD dwSize=0; isOK=ReadFile(fileHandle,buf,size,&dwSize,NULL);//读 } return isOK; } //关闭文件 BOOL FileLog::Close() { BOOL isOK=FALSE; Lock(); if(fileHandle!=INVALID_HANDLE_VALUE) { isOK=CloseHandle(fileHandle); fileHandle=INVALID_HANDLE_VALUE; } UnLock(); return isOK; }
当让也可以参考我根据转载写的一篇读写者问题的文章,秒杀多线程第十篇 读者写者问题 里面介绍了一个自己写读写锁的类,和一个利用SWLock的例子。了解了这些的话,个人认为能解决在项目中对文件操作的基本问题。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++如何控制数据对其而省掉零和ofstream
- 下一篇: 100道c语言面试题