C++ primer 第8章 IO庫

文章目錄

  • IO庫類型和頭文件
  • IO對象無拷貝或賦值
  • IO流的條件狀態
  • 文件輸入輸出
    • ifstream 示例
    • ofstream 示例
  • 文件模式
    • 以out模式打開文件會丟棄已有數據
    • 每次調用open時都會確定文件模式
    • ofstream 保留源文件 追加數據 示例
  • string流
    • istringstream示例
    • ostringstream示例

IO庫類型和頭文件

為了支持不同種類的IO處理操作,標準庫定義了一些IO類型。
iostream定義了用于讀寫流的基本類型。fstream定義了讀寫命名文件的類型。sstream定義了讀寫內存string對象的類型。
類型ifstream和istringstream都繼承自istream,因此,我們可以像使用istream對象一樣來使用ifstream和istringstream。
在這里插入圖片描述

IO對象無拷貝或賦值

由于不能拷貝IO對象,因此我們也不能將形參或返回類型設置為流類型。進行IO操作的函數通常以引用方式傳遞和返回流。讀寫一個IO對象會改變其狀態,因此傳遞和返回的引用不能是const的。

IO流的條件狀態

一個流一旦發生錯誤,其上后續的IO操作都會失敗。只有當一個流處于無錯狀態時,我們才可以從它讀取數據,向它寫入數據。由于流可能處于錯誤狀態,因此代碼通常應該在使用一個流之前檢查它是否處于良好狀態。確定一個流對象的狀態的最簡單的方法是將它當做一個條件使用。
badbit表示系統級錯誤,如不可恢復的讀寫錯誤。通常情況下,一旦badbit被置位,流就無法再使用了。在發生可恢復錯誤后,failbit被置位,如期望讀取數值卻讀出一個字符等錯誤。這種問題通常是可以修正的,流還可以繼續使用。如果到達文件結束位置,eofbit和failbit都會被置位。goodbit的值為0,表示流未發生錯誤。如果badbit、failbit和eofbit任一個被置位,則檢測流狀態的條件會失敗。

文件輸入輸出

頭文件fstream定義了三個類型來支持文件IO:ifstream從一個給定文件讀取數據,ofstream向一個給定文件寫入數據,以及fstream可以讀寫給定文件。
在這里插入圖片描述
創建文件流對象時,我們可以提供文件名(可選的)。如果提供了一個文件名,則open成員函數會自動被調用,示例如下:

ifstream in(ifile);  // 構造一個ifstream并打開給定文件ifile,在新c++標準中,文件名ifile既可以是庫類型string對象,也可以是C風格字符數組
ofstream out; // 輸出文件流未關聯到任何文件

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

流如果調用open失敗,failbit會被置位。對一個已經打開的文件流調用open會失敗,并會導致failbit被置位。隨后的試圖使用文件流的操作都會失敗。為了將文件流關聯到另外一個文件,必須首先關閉已經關聯的文件。一旦文件成功關閉,我們就可以打開新的文件關聯新的文件。

當一個fstream對象被銷毀時,close會自動被調用。

ifstream 示例

打開string文件,按行存儲元素,str即是每一行的string

ifstream in("text.txt");
string str;
getline(in,str);

將每一個單詞作為一個獨立的元素進行存儲

ifstream in("text.txt");
string str;
in>>str;

ofstream 示例

ofstream ofs("test.txt");
ofs << "hello"<<" world"<<endl;

文件模式

每個流都有一個關聯的文件模式,用來指出如何使用文件。
在這里插入圖片描述

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

默認情況下,我們打開一個ofstream時,文件的內容會被丟棄。阻止一個ofstream清空給定文件內容的方法是同時指定app模式。
保留被ofstream打開的文件中已有數據的唯一方法是顯式指定app或in模式。

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

通常情況下,out模式意味著同時使用trunc模式,即當前文件內容將被清空。當指定app模式時,文件中的已有數據得以保留,所有寫操作都在文件末尾進行。
在這里插入圖片描述

ofstream 保留源文件 追加數據 示例

ofstream ofs("test.txt",ofstream::app);
ofs << "hello"<<" world"<<endl;

string流

sstream頭文件定義了三個類型來支持內存IO,這些類型可以向string寫入數據,從string讀取數據,就像string是一個IO流一樣。
istringstream從string讀取數據,ostringstream向string寫入數據,而頭文件stringstream既可以從string讀取數據也可以向string寫入數據。
在這里插入圖片描述

istringstream示例

以整行為元素讀取文件,存入vector中,并用istringstream從vector中讀取元素,每次讀取一個單詞

ifstream ifs("test.txt");string str;vector<string>vec;while (getline(ifs,str)) {vec.push_back(str);}for (auto a:vec) {istringstream vecStr(a);string tmp;while(vecStr >> tmp)cout << tmp<<endl;}

ostringstream示例

ostringstream os;
os << "hello" << " world" << endl;
cout << os.str();

此時界面上會顯示hello world

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

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

相關文章

codeforces 486A-C語言解題報告

題目網址 題目解析 1.f(n)(-1)^nn 2.使用long long int 3.總結找出規律: if(i%2!0) return -1(i1)/2; else return i/2; 直接暴力求解—超時 #include<stdio.h> #include<stdlib.h> // TIME_LIMIT_EXCEEDED,此方法不行,超時 //注意規律&#xff01;&#xff01…

C++面試寶典 基本語言(三)

如果同時定義了兩個函數&#xff0c;一個帶const&#xff0c;一個不帶&#xff0c;會有問題嗎&#xff1f; 不會&#xff0c;這相當于函數的重載 #include<iostream> class A{ public:void print()const{std::cout << "Hello" << std::endl;}void…

C++ primer 第9章 順序容器

文章目錄順序容器類型確定使用哪種順序容器容器庫概覽容器操作迭代器迭代器支持的所有操作迭代器支持的所有運算迭代器范圍對構成范圍的迭代器的要求標準庫迭代器范圍左閉右開的三種性質容器定義和初始化將一個新容器創建為另一個容器的拷貝將array拷貝到vector中的代碼與順序容…

常用單位換算

字節單位換算 B(byte)字節 bit 位 1B 8 bit 1KB&#xff08;Kilobyte&#xff0c;千字節&#xff09;1024B 2^10 B&#xff1b; 1MB&#xff08;Megabyte&#xff0c;兆字節&#xff0c;百萬字節&#xff0c;簡稱“兆”&#xff09;1024KB 2^20 B&#xff1b; 1GB&#xf…

牛客網C++面經 容器和算法

原文網址 參考網址 C語言中文網 請你來說一下map和set有什么區別&#xff0c;分別又是怎么實現的&#xff1f; map和set都是C的關聯容器&#xff0c;其底層實現都是紅黑樹&#xff08;RB-Tree&#xff09;。由于 map 和set所開放的各種操作接口&#xff0c;RB-tree 也都提供…

C語言指針-字符指針整型指針char*s int*a

案例代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {//字符指針char *pstr"good dog ww";printf("字符指針指向的字符串內容:%s\n",pstr);printf("字符指針本身的地址:%p\n",&pstr);printf…

C++ primer 第10章 泛型算法

文章目錄概述findcount初識泛型算法只讀算法只讀算法accumulate只讀算法equal寫容器元素的算法算法fill算法fill_nback_inserter算法copy算法replace replace_copy重排容器元素的算法sortuniqueunique_copy定制操作向算法傳遞函數謂詞算法stable_sort算法partitionlambda表達式…

C語言常用字符串函數

概括 代碼 #include<stdlib.h> #include<stdio.h> #include<string.h> int main() {//常用字符串函數char a[]"abcSDFbnm";char b[]"SD";printf("a的字符串長度:%d\n",strlen(a));printf("b的字符串長度:%d\n",str…

C++ primer 第11章 關聯容器

文章目錄使用關聯容器map示例關聯容器概述定義關聯容器關聯容器值初始化multimap和multiset關鍵字類型的要求pair類型pair上的操作關聯容器操作關聯容器額外的類型別名關聯容器迭代器map迭代器set迭代器關聯容器和算法添加元素向map添加元素檢測insert的返回值使用insert代替下…

C++ primer 第12章 動態內存

文章目錄前言動態內存與智能指針shared_ptr類shared_ptr和unique_ptr都支持的操作shared_ptr獨有的操作make_shared 函數shared_ptr的拷貝和賦值shared_ptr自動銷毀所管理的對象shared_ptr還會自動釋放相關聯的內存程序使用動態內存出于以下原因直接管理內存使用new動態分配和初…

C語言順序查找二分查找

介紹 順序查找 按照順序一個個查找 #include<stdio.h> //順序查找 int search(int arr[],int len,int aim) {int i;for(i0;i<len;i){if(arr[i]aim){return i;//返回下標 }}return -1;//表示未查詢到} int main() {int arr[]{13,355,256,65,234,-1,35,-6,-3,-4,0};…

C++ primer 第12章 12.3 使用標準庫:文本查詢程序

文章目錄使用標準庫&#xff1a;文本查詢程序文本查詢程序設計數據結構在類之間共享數據自己的文本查詢程序書中的文本查詢程序使用標準庫&#xff1a;文本查詢程序 我們將實現一個簡單的文本查詢程序&#xff0c;作為標準庫相關內容學習的總結。 我們的程序允許用戶在一個給…

C語言二維數組 int arr[2][3]

基礎使用 先遍歷行再遍歷列 #include<stdio.h> //二維數組的基本使用 int main() {//二維數組的初始化int arr1[2][2]{{2,2},{0,0}};int arr2[2][3]{2,2,2,8,8,8};int arr3[6][9];int i,j;for(i0;i<6;i){for(j0;j<9;j){arr3[i][j]1;}}arr3[2][5]0;//打印printf(&…

牛客網C++面經 類和數據抽象

請你來說一下C中struct和class的區別 在C中&#xff0c;可以用struct和class定義類&#xff0c;都可以繼承。區別在于&#xff1a;structural的默認繼承權限和默認訪問權限是public&#xff0c;而class的默認繼承權限和默認訪問權限是private。另外&#xff0c;class還可以定義…

C++ primer 第13章 拷貝控制

文章目錄前言拷貝、賦值與銷毀拷貝構造函數合成拷貝構造函數拷貝初始化和直接初始化拷貝初始化的發生&#xff1a;參數和返回值拷貝初始化的限制拷貝賦值運算符重載賦值運算符合成拷貝賦值運算符析構函數析構函數完成的工作什么時候會調用析構函數合成析構函數代碼片段調用幾次…

C語言 指針自增自減加減運算 p++ p+i

介紹 自增自減代碼 #include<stdio.h> #include<string.h> //指針自增--short void increase(short *arr,int len) {int i;arr&arr[0];for(i0;i<len;i){printf("arr[%d]%d,address%p\n",i,*arr,arr);arr;} }//指針自減--char void decrease(char…

C++ 編譯與底層

原文鏈接 編譯與底層請你來說一下一個C源文件從文本到可執行文件經歷的過程&#xff1f; 對于C源文件&#xff0c;從文本到可執行文件一般需要四個過程&#xff1a;預處理階段&#xff1a;對源代碼文件中文件包含關系&#xff08;頭文件&#xff09;、預編譯語句&#xff08;…

C語言 指針數組-字符指針數組整型指針數組 char*s[3] int*a[5] 數組指針int(*p)[4]

基本介紹 1.指針數組:由n個指向整型元素的指針而組成,里面存放指針 Int *ptr[3]; 2.地址: ptr[i]:元素地址 &ptr[i]:指針地址 圖示 代碼: 內存布局: 代碼 #include<stdio.h> #include<string.h> //指針數組--int void pointer(int *arr,int len) {int …

uninitialized_copy測試代碼示例

原測試代碼如下&#xff1a; int main() {vector<int>v1{1,3,5,7,9,2,4,6,8};allocator<int>alloc;auto data alloc.allocate(9);uninitialized_copy(v1.begin(),v1.end(), data);auto end data 9;while(data!end) {cout << *data <<" "…

C語言的地址 內存

取地址在CPU的寄存器產生&#xff0c;不占據內存地址由計算器總線&#xff0c;地址作為常量不消耗內存指針 存儲不同的地址&#xff0c;間接賦值空類型指針 void* 類型指針 不可以取數據 或者修改數據 需要進行強制類型轉換int num 10;void *p &num;std::cout << …