好长时间了,一直想搞明白fopen() 与 CreateFile() 对文件操作的异同,没有下决心去弄,忙忙就忘掉了,今天从网上找些东西,查查这个问题.
我估计fopen()的底层实现就是通过CreateFile(),相似的,CFile 中的open() 成员函数也是一样通过 CreateFile实现.下面是问专家的回答.
问题: 用fopen()函数生成一个文件和用CreateFile()函数生成一个文件,这两个文件有什么不同?c/c++中的标准库函数如fread() fwrite fseek() fslose()能否可用?是否有功能类似API的函数也可用?请专家赐教非常感谢!!!
答案: 使用API和标准库函数都可以生成文本文件和二进制文件,在这点上没有区别。同fread()对应的是ReadFile,同fwrite()对应的是WriteFile,同fseek()对应的是SetFilePointer,同fclose对应的是CloseHandle。两套函数都可以使用,你熟悉哪个用哪个。不过API函数可以读写Windows的设备文件,功能更多一些。
打开文件的几种方式的比较:
1 fopen(TEXT("test.txt"),TEXT("r")); //char
_tfopen(TEXT("test.txt"),TEXT("r")); //TCHAR (unsigned long)
CFile.open(TEXT("test.txt"),CFile::modeCreate , &ex ) //CFile::modeCreate | CFile::modeWrite ,CFileException ex;
CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2 fopen(TEXT("test.txt"),TEXT("w")); //char
_tfopen(TEXT("test.txt"),TEXT("w")); //TCHAR (unsigned long)
CFile.open(TEXT("test.txt"),CFile::modeCreate | CFile::modeWrite|CFile::modeCreate, &ex )
CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL,
OPEN_EXISTING|,FILE_ATTRIBUTE_NORMAL,NULL);
如果文件打开成功则返回文件句柄,否则返回INVALID_HANDLE_VALUE。通过GetLastError来获取错误信息,文件的关闭很简单,只需要用CloseHandle就可以关闭文件,当文件被关闭时所有缓存内数据都会被写入到磁盘。