1. 程式人生 > >Stay Hungry(業精於勤,拒絕平庸)

Stay Hungry(業精於勤,拒絕平庸)

  在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的檔案I/O,stream這個類有兩個重要的運算子:   1、插入器(<<)   向流輸出資料。比如說系統有一個預設的標準輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Write Stdout"<<'n';就表示把字串"Write Stdout"和換行字元('n')輸出到標準輸出流。   2、析取器(>>)   從流中輸入資料。比如說系統有一個預設的標準輸入流(cin),一般情況下就是指的鍵盤,所以,cin>>x;就表示從標準輸入流中讀取一個指定型別(即變數x的型別)的資料。   在C++中,對檔案的操作是通過stream的子類fstream(file stream)來實現的,所以,要用這種方式操作檔案,就必須加入標頭檔案fstream.h。下面就把此類的檔案操作過程一一道來。

一、開啟檔案

  在fstream類中,有一個成員函式open(),就是用來開啟檔案的,其原型是:   void open(const char* filename,int mode,int access);   引數:   filename: 要開啟的檔名   mode: 要開啟檔案的方式   access: 開啟檔案的屬性   開啟檔案的方式在類ios(是所有流式I/O類的基類)中定義,常用的值如下:   ios::app: 以追加的方式開啟檔案   ios::ate: 檔案開啟後定位到檔案尾,ios:app就包含有此屬性   ios::binary: 以二進位制方式開啟檔案,預設的方式是文字方式。兩種方式的區別見前文   ios::in: 檔案以輸入方式開啟   ios::out: 檔案以輸出方式開啟   ios::nocreate: 不建立檔案,所以檔案不存在時開啟失敗   ios::noreplace:不覆蓋檔案,所以儲存檔案時如果檔案存在失敗   ios::trunc: 如果檔案存在,把檔案長度設為0   可以用“或”把以上屬性連線起來,如ios::out|ios::binary   // 注:現在C++標準庫不支援nocreate和noreplace,以前的舊版本可以用.   開啟檔案的屬性取值是:   0:普通檔案,開啟訪問   1:
只讀檔案
  2:隱含檔案   4:系統檔案   可以用“或”或者“+”把以上屬性連線起來 ,如3或1|2就是以只讀和隱含屬性開啟檔案。   例如:以二進位制輸入方式開啟檔案c:config.sys   fstream file1;   file1.open("c:config.sys",ios::binary|ios::in,0);   如果open函式只有檔名一個引數,則是以讀/寫普通檔案開啟,即:   file1.open("c:config.sys");<=>file1.open("c:config.sys",ios::in|ios::out,0);   另外,fstream還有和open()一樣的建構函式,對於上例,在定義的時候就可以開啟檔案了:   fstream file1("c:config.sys");   特別提出的是,fstream有兩個子類:ifstream(input file stream)和ofstream(output file stream),ifstream預設以輸入方式開啟檔案,而ofstream預設以輸出方式開啟檔案。   ifstream file2("c:pdos.def");//以輸入方式開啟檔案   ofstream file3("c:x.123");//以輸出方式開啟檔案   所以,在實際應用中,根據需要的不同,選擇不同的類來定義:如果想以輸入方式開啟,就用ifstream來定義;如果想以輸出方式開啟,就用ofstream來定義;如果想以輸入/輸出方式來開啟,就用fstream來定義。   包含:   需要在檔案中包含<fstream>,即:   #include <fstream>   後面可以加using namespace std;程式裡就可以直接用fstream類及其函數了。   或者在具體使用時用std::來標識,如:std::fstream file1;

二、關閉檔案

  開啟的檔案使用完成後一定要關閉,fstream提供了成員函式close()來完成此操作,如:file1.close();就把file1相連的檔案關閉。

三、讀寫檔案

  讀寫檔案分為文字檔案和二進位制檔案的讀取,對於文字檔案的讀取比較簡單,用插入器和析取器就可以了;而對於二進位制的讀取就要複雜些,下要就詳細的介紹這兩種方式   1、文字檔案的讀寫   文字檔案的讀寫很簡單:用插入器(<<)向檔案輸出;用析取器(>>)從檔案輸入。假設file1是以輸入方式開啟,file2以輸出開啟。示例如下:   file2<<"I Love You";//向檔案寫入字串"I Love You"   int i;   file1>>i;//從檔案輸入一個整數值。   這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進位制等等,具體的格式有以下一些   操縱符 功能 輸入/輸出   dec 格式化為十進位制數值資料 輸入和輸出   endl 輸出一個換行符並重新整理此流 輸出   ends 輸出一個空字元 輸出   hex 格式化為十六進位制數值資料 輸入和輸出   oct 格式化為八進位制數值資料 輸入和輸出   //setpxecision(int p) 設定浮點數的精度位數 輸出   setprecision(int p) 設定浮點數的精度位數 輸出   (setpxecision應該為setprecision,使用時需要包含標頭檔案:#include <iomanip.h>)   //比如要把123當作十六進位制輸出:file1<<hex<<123;要把
3.1415926
以5位精度輸出:file1<<setprecision(5)<<3.1415926。   比如要把123當作十六進位制輸出:file1<<hex<<123;要把3.1415926以5位精度輸出:file1<<setprecision(5)<<3.1415926。   2、二進位制檔案的讀寫   ①put()   put()函式向流寫入一個字元,其原型是ofstream &put(char ch),使用也比較簡單,如file1.put('c');就是向流寫一個字元'c'。   ②get()   get()函式比較靈活,有3種常用的過載形式:   一種就是和put()對應的形式:ifstream &get(char &ch);功能是從流中讀取一個字元,結果儲存在引用ch中,如果到檔案尾,返回空字元。如file2.get(x);表示從檔案中讀取一個字元,並把讀取的字元儲存在x中。   另一種過載形式的原型是: int get();這種形式是從流中返回一個字元,如果到達檔案尾,返回EOF,如x=file2.get();和上例功能是一樣的。   還有一種形式的原型是:ifstream &get(char *buf,int num,char delim='n');這種形式把字元讀入由 buf 指向的陣列,直到讀入了 num 個字元或遇到了由 delim 指定的字元,如果沒使用 delim 這個引數,將使用預設值換行符'n'。例如:   file2.get(str1,127,'A');//從檔案中讀取字元到字串str1,當遇到字元'A'或讀取了127個字元時終止。   ③讀寫資料塊   要讀寫二進位制資料塊,使用成員函式read()和write()成員函式,它們原型如下:   read(unsigned char *buf,int num);   write(const unsigned char *buf,int num);   read()從檔案中讀取 num 個字元到 buf 指向的快取中,如果在還未讀入 num 個字元時就到了檔案尾,可以用成員函式 int gcount();來取得實際讀取的字元數;而 write() 從buf 指向的快取寫 num 個字元到檔案中,值得注意的是快取的型別是 unsigned char *,有時可能需要型別轉換。   例:   unsigned char str1[]="I Love You";   int n[5];   ifstream in("xxx.xxx");   ofstream out("yyy.yyy");   out.write(str1,strlen(str1));//把字串str1全部寫到yyy.yyy中   in.read((unsigned char*)n,sizeof(n));//從xxx.xxx中讀取指定個整數,注意型別轉換   in.close();out.close();

四、檢測EOF

  成員函式eof()用來檢測是否到達檔案尾,如果到達檔案尾返回非0值,否則返回0。原型是int eof();   例: if(in.eof())ShowMessage("已經到達檔案尾!");

五、檔案定位

  和C的檔案操作方式不同的是,C++ I/O系統管理兩個與一個檔案相聯絡的指標。一個是讀指標,它說明輸入操作在檔案中的位置;另一個是寫指標,它下次寫操作的位置。每次執行輸入或輸出時,相應的指標自動變化。所以,C++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是 seekg()和 seekp(),seekg()是設定讀位置,seekp是設定寫位置。它們最通用的形式如下:   istream &seekg(streamoff offset,seek_dir origin);   ostream &seekp(streamoff offset,seek_dir origin);   streamoff定義於 iostream.h 中,定義有偏移量 offset 所能取得的最大值,seek_dir 表示移動的基準位置,是一個有以下值的列舉:   ios::beg: 檔案開頭   ios::cur: 檔案當前位置   ios::end: 檔案結尾   這兩個函式一般用於二進位制檔案,因為文字檔案會因為系統對字元的解釋而可能與預想的值不同。   例:   file1.seekg(1234,ios::cur);//把檔案的讀指標從當前位置向後移1234個位元組   file2.seekp(1234,ios::beg);//把檔案的寫指標從檔案開頭向後移1234個位元組   如果vc程式設計的話最好使用CFile類等更加方便於檔案操作</CA>

相關推薦

Stay Hungry業精於勤拒絕平庸

  在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的檔案I/O,stream這個類有兩個重要的運算子:   1、插入器(<<)   向流輸出資料。比如說系統有一個預設的標準輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Wr

騰訊雲服務器突然遠程連不上包含ssh拒絕訪問

img bsp 截圖 wid inf alt 雲服務 暫時 info 版權聲明:本文轉載自 https://blog.csdn.net/Alexwu555/article/details/78448113, 暫時這樣 , 以後再來整理。不太習慣不能直接貼截圖啊

STL語法——映射:map 反片語AnanagramsUVa 156

count lower code cin mos abc 最終 定義 lead Description Most crossword puzzle fans are used to anagrams--groups of words with the same let

用vue開發一個app2main.js

.html 第一次用 courier ace 第一次 router -s 提示 新建 昨天跟著vue的官網搭建了vue的一個腳手架,我也是第一次用VUE一切都在摸索階段。 今天試著看下裏面腳手架裏面有點什麽東西 先看看main.js

ccs3新特性---borderBackground部分

指定 其他 round 分隔 接收 source 縮小 20px 圓形 boder屬性新特性: border-radius 設置或檢索對象使用圓角邊框 border-top-left-radius 設置或檢索對象左上角圓角邊框 borde

Linux安裝yum的痛苦路程失敗慎入

1-1 一個 h+ thread php read centos lin png   1,在網上下載了一個yum 的 rpm文件(yum-3.2.29-81.el6.centos.noarch.rpm),我在 http://www.rpmfind.net/linux/rpm

更新整理本人所有博文中提供的代碼與工具C++2014.01

jbd mlu osg mef sgd dac gpa irf rtc 說酉讕vuu2c短殉炕<a target="_blank" href="http://weibo.com/u/6212262647">http://weibo.com/u/621226264

單例模式懶漢餓漢

ati turn 還需 sin 有用 只需要 對象 clas main Java中的單例模式一般分為懶漢模式和餓漢模式,懶漢模式只有用得到的時候對象才初始化,餓漢模式無論用得到與否,都先初始化。 懶漢模式在運行的時候獲取對象比較慢(因為類加載時並沒有創建對象實例),但是加載

POJ 1161 WallsFloyd 建圖

== clas mem have 聚會 城市 define clu include 題意: 給定n個城市, 然後城市之間會有長城相連, 長城之間會圍成M個區域, 有L個vip(每個vip會處於一個城市裏)要找一個區域聚會, 問一共最少跨越多少個長城。 分析: 其實這題難就

面向對象繼承多態

牢固 二維數組的定義格式:第一種:直接給定了每一個一維數組中數組長度數據類型[][] 數組名稱 = new 數據類型[m][n]第二種:給定了多少個一維數組,長度動態給定數據類型[][] 數組名稱 = new 數據類型[m][] ;第三種:二維數組中直接給定元素值數據類型[][] 數組名稱 = {{元素1,元

2016女生賽 HDU 5710 Digit-Sum數學思維題

accep ger sizeof memory fin left total src view Digit-Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Oth

小白學習server第二篇------策略本地本地組

server一、 本地安全策略概述本地安全策略影響本地計算機的安全設置控制面板→管理工具”→本地安全策略運行secpol.msc命令本地安全策略主要包含:帳戶策略本地策略 二、 帳戶策略1、密碼策略1)密碼必須符合復雜性需求:、英文字母大小寫、數字、特殊符號四者取其三。2)密碼長度最小值:設置範圍0-14

【BZOJ1023】仙人掌圖仙人掌動態規劃

轉移 tps 同時 HR code main 最大值 mes vector 【BZOJ1023】仙人掌圖(仙人掌,動態規劃) 題面 BZOJ 求仙人掌的直徑(兩點之間最短路徑最大值) 題解 一開始看錯題了,以為是求仙人掌中的最長路徑。。。 後來發現看錯題了一下就改過來了。。

使用原生JS發送AJAX請求XMLJSON解析

status quest chan ldoc text nbsp 字符 tco send mybutton.addEventListener(‘click‘, (e) => { let request = new XMLHttpRequest() r

FFmpeg源代碼簡單分析:常見結構體的初始化和銷毀AVFormatContextAVFrame等

new init _array border 代碼 alloc ecc .com VC 結構體 初始化 銷毀 AVFormatContext avformat_alloc_context() avfo

【BZOJ4755】扭動的回文串Manacher哈希

ring problem def www. 二分 cpp div char class 【BZOJ4755】扭動的回文串(Manacher,哈希) 題面 BZOJ 題解 不要真的以為看見了回文串就是\(PAM,Manacher\)一類就可以過。 這題顯然不行啊。 我們主要考

Atlantis HDU - 1542 掃描線線段樹

stack 是我 opera 分享 print 之前 roo size oot 掃描線的模板題,先把信息接收,然後排序,記錄下上邊和下邊,然後用一條虛擬的線從下往上掃。如果我掃到的是下邊,那麽久用線段樹在這個區間內加上1,表示這個區間現在是有的,等我掃描到上邊的時候在加上-

【BZOJ1093】[ZJOI2007]最大半聯通子圖Tarjan動態規劃

() queue 有一個 ble class empty cpp 之間 names 【BZOJ1093】[ZJOI2007]最大半聯通子圖(Tarjan,動態規劃) 題面 BZOJ 洛谷 洛谷的討論裏面有一個好看得多的題面 題解 顯然強連通分量對於題目是沒有任何影響的,直接

python語言程序設計12周

提示 imp 函數 語句 form eva convert rgb色彩 eth 實例1: 溫度轉換???????????????????????????????????????????????????????????????????????????????? 描述 這是"實

Linux串列埠程式設計教程——串列埠程式設計詳原始碼解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二----圖文並茂講解深刻http://blog.csdn.net/w28252

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne