好長時間了,一直想搞明白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就可以關閉文件,當文件被關閉時所有緩存內數據都會被寫入到磁盤。