好長(zhǎng)時(shí)間了,一直想搞明白fopen() 與 CreateFile() 對(duì)文件操作的異同,沒(méi)有下決心去弄,忙忙就忘掉了,今天從網(wǎng)上找些東西,查查這個(gè)問(wèn)題.
 
      我估計(jì)fopen()的底層實(shí)現(xiàn)就是通過(guò)CreateFile(),相似的,CFile 中的open() 成員函數(shù)也是一樣通過(guò) CreateFile實(shí)現(xiàn).下面是問(wèn)專(zhuān)家的回答.

      問(wèn)題: 用fopen()函數(shù)生成一個(gè)文件和用CreateFile()函數(shù)生成一個(gè)文件,這兩個(gè)文件有什么不同?c/c++中的標(biāo)準(zhǔn)庫(kù)函數(shù)如fread() fwrite fseek() fslose()能否可用?是否有功能類(lèi)似API的函數(shù)也可用?請(qǐng)專(zhuān)家賜教非常感謝!!! 

       答案: 使用API和標(biāo)準(zhǔn)庫(kù)函數(shù)都可以生成文本文件和二進(jìn)制文件,在這點(diǎn)上沒(méi)有區(qū)別。同fread()對(duì)應(yīng)的是ReadFile,同fwrite()對(duì)應(yīng)的是WriteFile,同fseek()對(duì)應(yīng)的是SetFilePointer,同fclose對(duì)應(yīng)的是CloseHandle。兩套函數(shù)都可以使用,你熟悉哪個(gè)用哪個(gè)。不過(guò)API函數(shù)可以讀寫(xiě)Windows的設(shè)備文件,功能更多一些。

打開(kāi)文件的幾種方式的比較:

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);

      如果文件打開(kāi)成功則返回文件句柄,否則返回INVALID_HANDLE_VALUE。通過(guò)GetLastError來(lái)獲取錯(cuò)誤信息,文件的關(guān)閉很簡(jiǎn)單,只需要用CloseHandle就可以關(guān)閉文件,當(dāng)文件被關(guān)閉時(shí)所有緩存內(nèi)數(shù)據(jù)都會(huì)被寫(xiě)入到磁盤(pán)。