C++primer第八章 IO庫 8.2 文件輸入輸出

8.2文件輸入輸出

  • 頭文件fstream定義了三個類型來支持文件IO:ifstream從一個給定文件讀取數據,ofstream向一個給定文件寫入數據,以及fstream可以讀寫給定文件。在17.5.3節中(第676頁)我們將介紹如何對同一個文件流既讀又寫。
  • 這些類型提供的操作與我們之前已經使用過的對象cin和cout的操作一樣。特別是,我們可以用IO運算符(<<和>>)來讀寫文件,可以用getline(參見3.2.2節,第79頁)從一個ifstream讀取數據,包括8.1節中(第278頁)介紹的內容也都適用于這些類型。
  • 除了繼承自iostream類型的行為之外,fstream中定義的類型還增加了一些新的成員來管理與流關聯的文件。在表8.3中列出了這些操作,我們可以對fstream,ifstream和ofstream對象調用這些操作,但不能對其他IO類型調用這些操作。

8.2.1使用文件流對象

  • 當我們想要讀寫一個文件時,可以定義一個文件流對象,并將對象與文件關聯起來。每個文件流類都定義了一個名為open的成員函數,它完成一些系統相關的操作,來定位給定的文件,并視情況打開為讀或寫模式
  • 創建文件流對象時,我們可以提供文件名(可選的)。如果提供了一個文件名,則open會自動被調用:
  • ifstreamin(ifile);//構造一個ifstream并打開給定文件
  • ofstream out;//輸出文件流未關聯到任何文件
  • 這段代碼定義了一個輸入流in,它被初始化為從文件讀取數據,文件名由string類型的參數ifile指定。第二條語句定義了一個輸出流out,未與任何文件關聯。在新C++重標準中,文件名既可以是庫類型string對象,也可以是C風格字符數組(參見3.5.4節,1第109頁)。舊版本的標準庫只允許C風格字符數組。

用fstream代替iostream&

  • 在8.1節(第279頁)已經提到過,在要求使用基類型對象的地方,我們可以用繼承類型的對象來替代。這意味著,接受一個iostream類型引用(或指針)參數的函數,可以用一個對應的fstream(或sstream)類型來調用。也就是說,如果有一個函數接受一個ostream&參數,我們在調用這個函數時,可以傳遞給它一個ofstream對象,對istream&和ifstream也是類似的。

成 員 函 數 open和 close

  • 如果我們定義了一個空文件流對象,可以隨后調用open來將它與文件關聯起來:
  • ifstream in(ifile);//構筑一個ifstream并打開給定文件
  • ofstream out;//輸出文件流未與任何文件相關聯
  • out.open(ifile+*'.copy");//打開指定文件
  • 如果調用open失敗,failbit會被置位(參見8.1.2節,第280頁)。因為調用open可能失敗,進行Open是否成功的檢測通常是一個好習慣:
  • if(out)//檢查open是否成功
  • //open成功,我們可以使用文件了
  • 這個條件判斷與我們之前將cin用作條件相似。如果open失敗,條件會為假,我們就不會去使用out了。
  • 一旦一個文件流已經打開,它就保持與對應文件的關聯。實際上,對一個已經打開的文件流調用open會失敗,并會導致failbit被置位。隨后的試圖使用文件流的操作都會失敗。為了將文件流關聯到另外一個文件,必須首先關閉已經關聯的文件。一旦文件成功關閉,我們可以打開新的文件:
  • in.close();//關閉文件
  • in.open(ifile+“2”);//打開另一個文件如果open成功,則open會設置流的狀態,使得good()為true。

自動構造和析構

  • 考慮這樣一個程序,它的main函數接受一個要處理的文件列表(參見6.2.5節,第】96頁)。這種程序可能會有如下的循環:
  • //對每個傳遞給程序的文件執行循環操作
//對每個傳遞給程序的文件執行循環操作for (auto p = argv + 1; p < argv + argc; ++p) {std::ifstream input(*p); //創建輸出流并且打開文件if (input){              //如果文件打開成功,“處理”這個文件//process(input);  } else{std::cerr << "couldn‘t open: " + std::string(*p);}}//每個循環步input都會離開作用域,因此會被銷毀
  • 每個循環步構造一個新的名為input的ifstream對象,并打開它來讀取給定的文件。像之前一樣,我們檢查open是否成功。如果成功,將文件傳遞給一個函數,該函數負責讀取并處理輸入數據。如果open失敗,打印一條錯誤信息并繼續處理下一個文件。因為input是while循環的局部變量,它在每個循環步中都要創建和銷毀一次(參見5.4.1節,第165頁)。當一個fstream對象離開其作用域時,與之關聯的文件會自動關閉。在下一步循環中,input會再次被創建。
  • 當一個fstream對象被銷毀時,close會自動被調用

8 .2 .2 文件模式

  • 每個流都有一個關聯的文件模式(file mode),用來指出如何使用文件。表 8.4列出了 文件模式和它們的含義。

  • 無論用哪種方式打開文件,我們都可以指定文件模式,調用。pen打開文件時可以,用一個文件名初始化流來隱式打開文件時也可以。指定文件模式有如下限制:
  • 只可以對ofstream或fstream對象設定out模式
  • 只可以對ifstream或fstream對象設定in模式
  • 只有當out也被設定時才可設定trunc模式
  • 只要trunc沒被設定,就可以設定app模式。在app模式下,即使沒有顯式指定out模式,文件也總是以輸出方式被打開。
  • 默認情況下,即使我們沒有指定trunc,以out模式打開的文件也會被截斷。為了保留以out模式打開的文件的內容,我們必須同時指定app模式,這樣只會將數據追加寫到文件末尾;或者同時指定in模式,即打開文件同時進行讀寫操作(參見17.5.3節,第676頁,將介紹對同一個文件既進行輸入又進行輸出的方法)。
  • ate和binary模式可用于任何類型的文件流對象,且可以與其他任何文件模式組合使用。
  • 每個文件流類型都定義了一個默認的文件模式,當我們未指定文件模式時,就使用此默認模式。與ifstream關聯的文件默認以in模式打開;與ofstream關聯的文件默認以out模式打開;與fstream關聯的文件默認以in和out模式打開。

以out模式打開文件會丟棄已有數據

  • 默認情況下,當我們打開一個ofstmam時,文件的內容會被丟棄。阻止一個ofstream清空給定文件內容的方法是同時指定app模式
  • //在這幾條語句中,filel都被截斷
  • ofstream out("file1");//隱含以輸出模式打開文件并截斷文件
  • ofstream out2("file1",ofstream::out);//隱含地截斷文件
  • ofstreamout3("file1",ofstream::out|ofstream::trunc);
  • //為了保留文件內容,我們必須顯式指定app模式
  • ofstream app("file2”,ofstream::app);//隱含為輸出模式
  • ofstreamapp2(nfile2n,ofstream::out|ofstream::app);
  • 保留被ofstream打開的文件中已有數據的唯一方法是顯式指定app或 in 模式

每次調用open時都會確定文件模式

  • 對于一個給定流,每當打開文件時,都可以改變其文件模式。
  • ofstreamout;//未指定文件打開模式
  • out.open(^scratchpad");//模式隱合設置為輸出和截斷
  • out.close();//關閉out,以便我們將其用于其他文件
  • out.open("precious",ofstream::app);//模式為輸出和追加
  • out.close();
  • 第一個open調用未顯式指定輸出模式,文件隱式地以out模式打開。通常情況下,out模式意味著同時使用trunc模式。因此,當前目錄下名為scratchpad的文件的內容將被清空。當打開名為precious的文件時,我們指定了append模式(app)。文件中已有的數據都得以保留,所有寫操作都在文件末尾進行。
  • 在每次打開文件時,都要設置文件模式,可能是顯式地設置,也可能是隱式地也設置當程序未指定模式時,就使用默認值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

codeforces 112A-C語言解題報告

112A題目網址 題目解析 1.輸入兩行字符串,不區分大小寫地使用字典序去比較大小 A<B -1 A>B 1 AB 0 舉例: 輸入 abcdefg AbCdEfF 輸出 1 2.字典序:在遇到第一個不同的字符時,比較的大小,就是字符串的大小 列舉法: 1.列出所有情況 1)a[i]是大寫,b[i]是小寫 a[i]轉換為小…

SpringBoot 集成 Nacos

目錄一、前言二、Nacos集成1、引入Nacos依賴2、設置Nacos配置3、加載Nacos配置中心配置項4、Nacos集成驗證5、Nacos配置中心配置項動態生效Nacos安裝詳見&#xff1a;Spring Cloud 系列之 Nacos 配置中心 一、前言 上一篇已經講解了怎樣安裝安裝、啟動、配置 Nacos&#xff0c…

C++primer第八章 IO庫 8.3string流

8.3string流 sstream頭文件定義了三個類型來支持內存IO,這些類型可以向string寫入數據,從string讀取數據&#xff0c;就像string是一個IO流一樣。istringstream從string讀取數據&#xff0c;ostringstream向string寫入數據&#xff0c;而頭文件stringstream既可從string讀數據…

英語口語海報演講--東軟

海報 海報上的內容 Nuclear waste water 1.Damage the devastating impact of nuclear radiation on the world 2.Marine life genetically mutated or dead 3.water resources polluted water resources 4.the future of humanity genetic damage/food and environment destr…

Java中 List、Set、Map遍歷方式以及性能比較

目錄一、簡介二、遍歷方式1、ArrayList遍歷方式&#xff08;1&#xff09;for循環遍歷&#xff08;2&#xff09;foreach循環遍歷&#xff08;3&#xff09;Iterator迭代器遍歷2、LinkedList遍歷方式&#xff08;1&#xff09;for循環遍歷&#xff08;2&#xff09;foreach循環…

codeforces 263A-C語言解題報告

263A題目網址 題目解析 1.輸入5*5的矩陣(下標從到5),包含24個0和一個1,問如何移動最小的次數(i相鄰行或列)可以讓1位于3行3列 舉例: 輸入: 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 輸出: 3 注意點 1.因為數組是從0開始的,所以減2就行 row-2col-2 2.使用整型二維…

一個DEMO讓你徹底理解線程池

目錄一、簡介二、線程池任務場景場景一&#xff1a;提交5個任務&#xff0c;執行總耗時500ms場景二&#xff1a;提交10個任務&#xff0c;執行總耗時500ms場景三&#xff1a;提交11個任務&#xff0c;執行總耗時1000ms場景四&#xff1a;提交20個任務&#xff0c;執行總耗時100…

C++primer第九章 順序容器 9.1 順序容器概述 9.2容器庫概覽

一個容器就是一些特定類型對象的集合。順序容器(sequentialcontainer)為程序員提供了控制元素存儲和訪問順序的能力。這種順序不依賴于元素的值&#xff0c;而是與元素加入容器時的位置相對應。與之相對的&#xff0c;我們將在第11章介紹的有序和無序關聯容器&#xff0c;則根據…

SpringBoot 啟動報錯:Failed to configure a DataSource: ‘url‘ attribute is not specified and no emb

目錄一、報錯日志二、原因分析三、問題排查四、解決方案方案一&#xff1a;如果項目不需要數據庫相關信息就排除此類的autoconfig方案二&#xff1a;配置文件添加數據庫鏈接信息方案三&#xff1a;配置pom.xml中yml或者properties掃描一、報錯日志 **************************…

codeforces 339A-C語言解題報告

339A題目網址 題目解析 1.輸入如321的式子,升序排序(從小到大)成123 舉例: 輸入: 11313 輸出: 11133 2.對字符串進行排序采取拍冒泡排序算法 char c0; for(i0;i<strlen(s)-1;i) {for(j0;j<strlen(s)-1;j){if(s[j]>s[j1]){cs[j];s[j]s[j1];s[j1]c;}} }代碼 #includ…

C++primer第九章 順序容器 9.3 順序容器操作

9.3順序容器操作 順序容器和關聯容器的不同之處在于兩者組織元素的方式。這些不同之處直接關系到了元素如何存儲、訪問、添加以及刪除。上一節介紹了所有容器都支持的操作&#xff08;羅列于表9.2&#xff08;第295頁&#xff09;&#xff09;。本章剩余部分將介紹順序容器所特…

SpringBoot 集成Nacos報錯(一)

目錄配置信息報錯信息解決方案配置信息 <project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/></parent>…

C++primer第九章 順序容器 9.4 vector對象是如何增長的

為了支持快速隨機訪問&#xff0c;vector將元素連續存儲&#xff0c;每個元素緊挨著前一個元素存儲。通常情況下&#xff0c;我們不必關心一個標準庫類型是如何實現的&#xff0c;而只需關心它如何使用。然而&#xff0c;對于vector和string,其部分實現滲透到了接口中。假定容器…

codeforces 281A-C語言解題報告

281A題目網址 題目解析 1.字符串首字母大寫 代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() {char s[1000]{\0};scanf("%s",s);if(s[0]>A&&s[0]<Z){printf("%s",s…

SpringBoot 配置文件bootstrap和application的區別

目錄一、SpringBoot配置文件二、bootstrap和application區別三、bootstrap和application的應用場景一、SpringBoot配置文件 bootstrap&#xff08;.yml 或者 .properties&#xff09; application&#xff08;.yml 或者 .properties&#xff09; 二、bootstrap和application區…

C++primer第九章 順序容器 9.5 額外的string操作

除了順序容器共同的操作之外&#xff0c;string類型還提供了一些額外的操作。這些操作中 的大部分要么是提供string類和C 風格字符數組之間的相互轉換,要么是增加了允許我們用下標代替迭代器的版本。標準庫string類型定義了大量函數。幸運的是&#xff0c;這些函數使用了重復的…

Zookeeper Mac下安裝操作

目錄一、下載Zookeeper二、修改配置1、設置啟動配置文件2、修改配置三、啟動Zookeeper服務命令1、bin目錄下執行&#xff08;1&#xff09;啟動Zookeeper命令&#xff08;2&#xff09;查看Zookeeper狀態命令&#xff08;3&#xff09;停止Zookeeper命令2、配置環境變量執行&am…

codeforces 266A-C語言解題報告

266A題目網址 題目解析 1.輸入n(1–50)個石頭個數,輸入RGB的石頭顏色,求問拿走最小的石頭個數,讓它們相鄰的石頭顏色不同 代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {int n,i,count0;char s[50]{\0};scanf("%d&quo…

2014年考研英語二作文PartB圖表題

作文詳細解析 題目 Write an essay based on the following chart, in which you should interpret the chart, and give your comments You should write about 150 words on the ANSWER SHEET.(15 points) 注意點 1.圖表題在第一段描述圖表信息時,一定要寫清楚y軸變化…

Zookeeper 終端命令

目錄一、服務端命令1、啟動Zookeeper服務命令2、查看Zookeeper狀態命令3、停止Zookeeper服務命令4、啟動Zookeeper客戶端命令二、客戶端命令1、查看幫助2、查看當前znode所包含的內容3、創建znode4、創建短暫znode5、創建帶序號znode6、創建短暫帶序號znode7、獲取znode數據8、…