日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何用C++讀寫(xiě)文件

在 C++ 中,對(duì)文件的讀寫(xiě)可以通過(guò)使用輸入輸出流與流運(yùn)算符 >> 和 << 來(lái)進(jìn)行。當(dāng)讀寫(xiě)文件的時(shí)候,這些運(yùn)算符被應(yīng)用于代表硬盤(pán)驅(qū)動(dòng)器上文件類的實(shí)例上。這種基于流的方法有個(gè)巨大的優(yōu)勢(shì):從 C++ 的角度,無(wú)論你要讀取或?qū)懭氲膬?nèi)容是文件、數(shù)據(jù)庫(kù)、控制臺(tái),亦或是你通過(guò)網(wǎng)絡(luò)連接的另外一臺(tái)電腦,這都無(wú)關(guān)緊要。因此,知道如何使用流運(yùn)算符來(lái)寫(xiě)入文件能夠被轉(zhuǎn)用到其他領(lǐng)域。

輸入輸出流類

C++ 標(biāo)準(zhǔn)庫(kù)提供了 ios_base 類。該類作為所有 I/O 流的基類,例如 basic_ofstream 和 basic_ifstream。本例將使用讀/寫(xiě)字符的專用類型 ifstream 和 ofstream

  • ofstream:輸出文件流,并且其能通過(guò)插入運(yùn)算符 << 來(lái)實(shí)現(xiàn)。
  • ifstream:輸入文件流,并且其能通過(guò)提取運(yùn)算符 >> 來(lái)實(shí)現(xiàn)。

該兩種類型都是在頭文件  中所定義。

從 ios_base 繼承的類在寫(xiě)入時(shí)可被視為數(shù)據(jù)接收器,在從其讀取時(shí)可被視為數(shù)據(jù)源,與數(shù)據(jù)本身完全分離。這種面向?qū)ο蟮姆椒ㄊ?nbsp;關(guān)注點(diǎn)分離separation of concerns 和 依賴注入dependency injection 等概念易于實(shí)現(xiàn)。

一個(gè)簡(jiǎn)單的例子

本例程是非常簡(jiǎn)單:實(shí)例化了一個(gè) ofstream 來(lái)寫(xiě)入,和實(shí)例化一個(gè) ifstream 來(lái)讀取。

 
 
 
 
  1. #include // cout, cin, cerr etc...
  2. #include // ifstream, ofstream
  3. #include
  4. int main()
  5. {
  6. std::string sFilename = "MyFile.txt";
  7. /******************************************
  8. * *
  9. * WRITING *
  10. * *
  11. ******************************************/
  12. std::ofstream fileSink(sFilename); // Creates an output file stream
  13. if (!fileSink) {
  14. std::cerr << "Canot open " << sFilename << std::endl;
  15. exit(-1);
  16. }
  17. /* std::endl will automatically append the correct EOL */
  18. fileSink << "Hello Open Source World!" << std::endl;
  19. /******************************************
  20. * *
  21. * READING *
  22. * *
  23. ******************************************/
  24. std::ifstream fileSource(sFilename); // Creates an input file stream
  25. if (!fileSource) {
  26. std::cerr << "Canot open " << sFilename << std::endl;
  27. exit(-1);
  28. }
  29. else {
  30. // Intermediate buffer
  31. std::string buffer;
  32. // By default, the >> operator reads word by workd (till whitespace)
  33. while (fileSource >> buffer)
  34. {
  35. std::cout << buffer << std::endl;
  36. }
  37. }
  38. exit(0);
  39. }

該代碼可以在 GitHub 上查看。當(dāng)你編譯并且執(zhí)行它時(shí),你應(yīng)該能獲得以下輸出:

Console screenshot

這是個(gè)簡(jiǎn)化的、適合初學(xué)者的例子。如果你想去使用該代碼在你自己的應(yīng)用中,請(qǐng)注意以下幾點(diǎn):

  • 文件流在程序結(jié)束的時(shí)候自動(dòng)關(guān)閉。如果你想繼續(xù)執(zhí)行,那么應(yīng)該通過(guò)調(diào)用 close() 方法手動(dòng)關(guān)閉。
  • 這些文件流類繼承自 basic_ios(在多個(gè)層次上),并且重載了 ! 運(yùn)算符。這使你可以進(jìn)行簡(jiǎn)單的檢查是否可以訪問(wèn)該流。在 cppreference.com 上,你可以找到該檢查何時(shí)會(huì)(或不會(huì))成功的概述,并且可以進(jìn)一步實(shí)現(xiàn)錯(cuò)誤處理。
  • 默認(rèn)情況下,ifstream 停在空白處并跳過(guò)它。要逐行讀取直到到達(dá) EOF ,請(qǐng)使用 getline(...) 方法。
  • 為了讀寫(xiě)二進(jìn)制文件,請(qǐng)將 std::ios::binary 標(biāo)志傳遞給構(gòu)造函數(shù):這樣可以防止 EOL 字符附加到每一行。

從系統(tǒng)角度進(jìn)行寫(xiě)入

寫(xiě)入文件時(shí),數(shù)據(jù)將寫(xiě)入系統(tǒng)的內(nèi)存寫(xiě)入緩沖區(qū)中。當(dāng)系統(tǒng)收到系統(tǒng)調(diào)用 sync 時(shí),此緩沖區(qū)的內(nèi)容將被寫(xiě)入硬盤(pán)。這也是你在不告知系統(tǒng)的情況下,不要卸下 U 盤(pán)的原因。通常,守護(hù)進(jìn)程會(huì)定期調(diào)用 sync。為了安全起見(jiàn),也可以手動(dòng)調(diào)用 sync()

 
 
 
 
  1. #include // needs to be included
  2. sync();

總結(jié)

在 C++ 中讀寫(xiě)文件并不那么復(fù)雜。更何況,如果你知道如何處理輸入輸出流,(原則上)那么你也知道如何處理任何類型的輸入輸出設(shè)備。對(duì)于各種輸入輸出設(shè)備的庫(kù)能讓你更容易地使用流運(yùn)算符。這就是為什么知道輸入輸出流的流程會(huì)對(duì)你有所助益的原因。


文章題目:如何用C++讀寫(xiě)文件
文章轉(zhuǎn)載:http://www.5511xx.com/article/dphshhs.html