偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

用C++實(shí)現(xiàn)簡(jiǎn)單的文件I/O操作

開(kāi)發(fā) 后端
本文介紹的是C++實(shí)現(xiàn)簡(jiǎn)單的文件的I/O操作,希望對(duì)你有幫助,一起來(lái)看。

文件 I/O C++中比烤蛋糕簡(jiǎn)單多了。 在這篇文章里,我會(huì)詳細(xì)解釋ASCII和二進(jìn)制文件的輸入輸出的每個(gè)細(xì)節(jié),值得注意的是,所有這些都是用C++完成的。

一、ASCII 輸出

為了使用下面的方法, 你必須包含頭文件<fstream.h>(譯者注:在標(biāo)準(zhǔn)C++中,已經(jīng)使用<fstream>取代<fstream.h>,所有的C++標(biāo)準(zhǔn)頭文件都是無(wú)后綴的。)。這是 <iostream.h>的一個(gè)擴(kuò)展集, 提供有緩沖的文件輸入輸出操作. 事實(shí)上, <iostream.h> 已經(jīng)被<fstream.h>包含了, 所以你不必包含所有這兩個(gè)文件, 如果你想顯式包含他們,那隨便你。我們從文件操作類(lèi)的設(shè)計(jì)開(kāi)始, 我會(huì)講解如何進(jìn)行ASCII I/O操作。 如果你猜是"fstream," 恭喜你答對(duì)了! 但這篇文章介紹的方法,我們分別使用"ifstream"?和 "ofstream" 來(lái)作輸入輸出。

如果你用過(guò)標(biāo)準(zhǔn)控制臺(tái)流"cin"?和 "cout," 那現(xiàn)在的事情對(duì)你來(lái)說(shuō)很簡(jiǎn)單。 我們現(xiàn)在開(kāi)始講輸出部分,首先聲明一個(gè)類(lèi)對(duì)象。

  1. ofstream fout; 

 

這就可以了,不過(guò)你要打開(kāi)一個(gè)文件的話, 必須像這樣調(diào)用ofstream::open()。

 

  1. fout.open("output.txt"); 

 

你也可以把文件名作為構(gòu)造參數(shù)來(lái)打開(kāi)一個(gè)文件.

 

  1. ofstream fout("output.txt"); 

 

這是我們使用的方法, 因?yàn)檫@樣創(chuàng)建和打開(kāi)一個(gè)文件看起來(lái)更簡(jiǎn)單. 順便說(shuō)一句, 如果你要打開(kāi)的文件不存在,它會(huì)為你創(chuàng)建一個(gè), 所以不用擔(dān)心文件創(chuàng)建的問(wèn)題. 現(xiàn)在就輸出到文件,看起來(lái)和"cout"的操作很像。 對(duì)不了解控制臺(tái)輸出"cout"的人, 這里有個(gè)例子。

 

  1. int num = 150;  
  2. char name[] = "John Doe";  
  3. fout << "Here is a number: " << num << "\n";  
  4. fout << "Now here is a string: " << name << "\n"

 

現(xiàn)在保存文件,你必須關(guān)閉文件,或者回寫(xiě)文件緩沖. 文件關(guān)閉之后就不能再操作了, 所以只有在你不再操作這個(gè)文件的時(shí)候才調(diào)用它,它會(huì)自動(dòng)保存文件。 回寫(xiě)緩沖區(qū)會(huì)在保持文件打開(kāi)的情況下保存文件, 所以只要有必要就使用它。 回寫(xiě)看起來(lái)像另一次輸出, 然后調(diào)用方法關(guān)閉。像這樣:

 

  1. fout << flush; fout.close(); 

 

現(xiàn)在你用文本編輯器打開(kāi)文件,內(nèi)容看起來(lái)是這樣:

Here is a number: 150 Now here is a string: John Doe

很簡(jiǎn)單吧! 現(xiàn)在繼續(xù)文件輸入, 需要一點(diǎn)技巧, 所以先確認(rèn)你已經(jīng)明白了流操作,對(duì) "<<" 和">>" 比較熟悉了, 因?yàn)槟憬酉聛?lái)還要用到他們。繼續(xù)…

二、ASCII 輸入

輸入和"cin" 流很像. 和剛剛討論的輸出流很像, 但你要考慮幾件事情。在我們開(kāi)始復(fù)雜的內(nèi)容之前, 先看一個(gè)文本:

12 GameDev 15.45 L This is really awesome!

為了打開(kāi)這個(gè)文件,你必須創(chuàng)建一個(gè)in-stream對(duì)象,?像這樣。

 

  1. ifstream fin("input.txt"); 

 

現(xiàn)在讀入前四行. 你還記得怎么用"<<" 操作符往流里插入變量和符號(hào)吧?好,?在 "<<" (插入)?操作符之后,是">>" (提取) 操作符. 使用方法是一樣的. 看這個(gè)代碼片段.

 

  1. int number;   
  2. float real;   
  3. char letter, word[8];   
  4. fin >> number; fin >> word; fin >> real; fin >> letter; 

 

也可以把這四行讀取文件的代碼寫(xiě)為更簡(jiǎn)單的一行。

 

  1. fin >> number >> word >> real >> letter; 

 

它是如何運(yùn)作的呢? 文件的每個(gè)空白之后, ">>" 操作符會(huì)停止讀取內(nèi)容, 直到遇到另一個(gè)>>操作符. 因?yàn)槲覀冏x取的每一行都被換行符分割開(kāi)(是空白字符), ">>" 操作符只把這一行的內(nèi)容讀入變量。這就是這個(gè)代碼也能正常工作的原因。但是,可別忘了文件的最后一行。

This is really awesome!

如果你想把整行讀入一個(gè)char數(shù)組, 我們沒(méi)辦法用">>"?操作符,因?yàn)槊總€(gè)單詞之間的空格(空白字符)會(huì)中止文件的讀取。為了驗(yàn)證:

 

  1. char sentence[101]; fin >> sentence; 

 

我們想包含整個(gè)句子, "This is really awesome!" 但是因?yàn)榭瞻? 現(xiàn)在它只包含了"This". 很明顯, 肯定有讀取整行的方法, 它就是getline()。這就是我們要做的。

 

  1. fin.getline(sentence, 100); 

 

這是函數(shù)參數(shù). 第一個(gè)參數(shù)顯然是用來(lái)接受的char數(shù)組. 第二個(gè)參數(shù)是在遇到換行符之前,數(shù)組允許接受的最大元素?cái)?shù)量. 現(xiàn)在我們得到了想要的結(jié)果:“This is really awesome!”。

你應(yīng)該已經(jīng)知道如何讀取和寫(xiě)入ASCII文件了。但我們還不能罷休,因?yàn)槎M(jìn)制文件還在等著我們。

三、二進(jìn)制 輸入輸出

二進(jìn)制文件會(huì)復(fù)雜一點(diǎn), 但還是很簡(jiǎn)單的。 首先你要注意我們不再使用插入和提取操作符(譯者注:<< 和 >> 操作符). 你可以這么做,但它不會(huì)用二進(jìn)制方式讀寫(xiě)。你必須使用read() 和write() 方法讀取和寫(xiě)入二進(jìn)制文件. 創(chuàng)建一個(gè)二進(jìn)制文件, 看下一行。

 

  1. ofstream fout("file.dat", ios::binary); 

 

這會(huì)以二進(jìn)制方式打開(kāi)文件, 而不是默認(rèn)的ASCII模式。首先從寫(xiě)入文件開(kāi)始。函數(shù)write() 有兩個(gè)參數(shù)。 第一個(gè)是指向?qū)ο蟮腸har類(lèi)型的指針, 第二個(gè)是對(duì)象的大小(譯者注:字節(jié)數(shù))。 為了說(shuō)明,看例子。

 

  1. int number = 30;   
  2. fout.write((char *)(&number), sizeof(number)); 

 

第一個(gè)參數(shù)寫(xiě)做"(char *)(&number)". 這是把一個(gè)整型變量轉(zhuǎn)為char *指針。如果你不理解,可以立刻翻閱C++的書(shū)籍,如果有必要的話。第二個(gè)參數(shù)寫(xiě)作"sizeof(number)". sizeof() 返回對(duì)象大小的字節(jié)數(shù). 就是這樣!

二進(jìn)制文件最好的地方是可以在一行把一個(gè)結(jié)構(gòu)寫(xiě)入文件。 如果說(shuō),你的結(jié)構(gòu)有12個(gè)不同的成員。 用ASCII?文件,你不得不每次一條的寫(xiě)入所有成員。 但二進(jìn)制文件替你做好了。 看這個(gè)。

 

  1. struct OBJECT { int number; char letter; } obj;   
  2. obj.number = 15;  
  3. obj.letter = ‘M’;   
  4. fout.write((char *)(&obj), sizeof(obj)); 

 

這樣就寫(xiě)入了整個(gè)結(jié)構(gòu)! 接下來(lái)是輸入. 輸入也很簡(jiǎn)單,因?yàn)閞ead()?函數(shù)的參數(shù)和 write()是完全一樣的, 使用方法也相同。

 

  1. ifstream fin("file.dat", ios::binary);   
  2. fin.read((char *)(&obj), sizeof(obj)); 

 

我不多解釋用法, 因?yàn)樗蛍rite()是完全相同的。二進(jìn)制文件比ASCII文件簡(jiǎn)單, 但有個(gè)缺點(diǎn)是無(wú)法用文本編輯器編輯。 接著, 我解釋一下ifstream 和ofstream 對(duì)象的其他一些方法作為結(jié)束.

四、更多方法

我已經(jīng)解釋了ASCII文件和二進(jìn)制文件, 這里是一些沒(méi)有提及的底層方法。

檢查文件

你已經(jīng)學(xué)會(huì)了open() 和close() 方法, 不過(guò)這里還有其它你可能用到的方法。

方法good() 返回一個(gè)布爾值,表示文件打開(kāi)是否正確。

類(lèi)似的,bad() 返回一個(gè)布爾值表示文件打開(kāi)是否錯(cuò)誤。 如果出錯(cuò),就不要繼續(xù)進(jìn)一步的操作了。

最后一個(gè)檢查的方法是fail(), 和bad()有點(diǎn)相似, 但沒(méi)那么嚴(yán)重。

讀文件

方法get() 每次返回一個(gè)字符。

方法ignore(int,char) 跳過(guò)一定數(shù)量的某個(gè)字符, 但你必須傳給它兩個(gè)參數(shù)。第一個(gè)是需要跳過(guò)的字符數(shù)。 第二個(gè)是一個(gè)字符, 當(dāng)遇到的時(shí)候就會(huì)停止。 例子,

 

  1. fin.ignore(100, ‘\n’); 

 

會(huì)跳過(guò)100個(gè)字符,或者不足100的時(shí)候,跳過(guò)所有之前的字符,包括 ‘\n’。

方法peek() 返回文件中的下一個(gè)字符, 但并不實(shí)際讀取它。所以如果你用peek() 查看下一個(gè)字符, 用get() 在peek()之后讀取,會(huì)得到同一個(gè)字符, 然后移動(dòng)文件計(jì)數(shù)器。

方法putback(char) 輸入字符, 一次一個(gè), 到流中。我沒(méi)有見(jiàn)到過(guò)它的使用,但這個(gè)函數(shù)確實(shí)存在。

寫(xiě)文件

只有一個(gè)你可能會(huì)關(guān)注的方法.?那就是 put(char), 它每次向輸出流中寫(xiě)入一個(gè)字符。

打開(kāi)文件

當(dāng)我們用這樣的語(yǔ)法打開(kāi)二進(jìn)制文件:

 

  1. ofstream fout("file.dat", ios::binary); 

 

"ios::binary"是你提供的打開(kāi)選項(xiàng)的額外標(biāo)志. 默認(rèn)的, 文件以ASCII方式打開(kāi), 不存在則創(chuàng)建, 存在就覆蓋. 這里有些額外的標(biāo)志用來(lái)改變選項(xiàng)。

  • ios::app 添加到文件尾
  • ios::ate 把文件標(biāo)志放在末尾而非起始。
  • ios::trunc 默認(rèn). 截?cái)嗖⒏矊?xiě)文件。
  • ios::nocreate 文件不存在也不創(chuàng)建。
  • ios::noreplace 文件存在則失敗。

文件狀態(tài)

我用過(guò)的唯一一個(gè)狀態(tài)函數(shù)是eof(), 它返回是否標(biāo)志已經(jīng)到了文件末尾。 我主要用在循環(huán)中。 例如, 這個(gè)代碼斷統(tǒng)計(jì)小寫(xiě)‘e’ 在文件中出現(xiàn)的次數(shù)。

 

  1. ifstream fin("file.txt");   
  2. char ch; int counter;   
  3. while (!fin.eof()) {  
  4. ch = fin.get();   
  5. if (ch == ‘e’) counter++;   
  6. }  
  7. fin.close(); 

 

我從未用過(guò)這里沒(méi)有提到的其他方法。 還有很多方法,但是他們很少被使用。參考C++書(shū)籍或者文件流的幫助文檔來(lái)了解其他的方法。

結(jié)論

你應(yīng)該已經(jīng)掌握了如何使用ASCII文件和二進(jìn)制文件。有很多方法可以幫你實(shí)現(xiàn)輸入輸出,盡管很少有人使用他們。 我知道很多人不熟悉文件I/O操作,我希望這篇文章對(duì)你有所幫助。 每個(gè)人都應(yīng)該知道. 文件I/O還有很多顯而易見(jiàn)的方法,?例如包含文件 <stdio.h>. 我更喜歡用流是因?yàn)樗麄兏?jiǎn)單。 祝所有讀了這篇文章的人好運(yùn), 也許以后我還會(huì)為你們寫(xiě)些東西。

責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2023-09-19 23:26:15

++i原子操作C++

2011-06-17 16:09:04

freadfwrite

2023-10-30 10:29:50

C++最小二乘法

2010-02-03 09:59:42

C++文件流操作

2015-08-10 14:39:46

Java 操作建議

2024-05-06 11:19:20

內(nèi)存池計(jì)算機(jī)編程

2010-02-05 16:18:41

C++流式文件操作

2016-10-20 16:07:11

C++Modern C++異步

2024-01-15 06:01:36

C++數(shù)組

2011-03-04 10:04:31

Linux文件操作命令

2010-02-01 10:32:01

C++文件操作

2018-11-05 11:20:54

緩沖IO

2009-08-19 09:57:01

C++ RAII

2009-08-28 15:49:45

C#對(duì)INI文件操作

2016-10-12 13:53:38

JavaByteBufferRandomAcces

2011-01-14 09:25:28

LinuxIO機(jī)制

2009-08-19 10:09:21

C#和C++

2010-02-06 15:15:31

C++ Builder

2020-06-16 16:25:05

C++JavaPython

2010-01-22 16:21:50

C++ Builder
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)