日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++文件读写相关

發(fā)布時(shí)間:2024/1/17 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++文件读写相关 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在看C++編程思想中,每個(gè)練習(xí)基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含義,在看了幾位大牛的博文后,進(jìn)行整理和總結(jié):

這里主要是討論fstream的內(nèi)容:

[java]?view plaincopyprint? ?
  • #include?<fstream>??
  • ofstream?????????//文件寫操作?內(nèi)存寫入存儲(chǔ)設(shè)備???
  • ifstream?????????//文件讀操作,存儲(chǔ)設(shè)備讀區(qū)到內(nèi)存中??
  • fstream??????????//讀寫操作,對(duì)打開的文件可進(jìn)行讀寫操作 ??
  • 1.打開文件

    在fstream類中,成員函數(shù)open()實(shí)現(xiàn)打開文件的操作,從而將數(shù)據(jù)流和文件進(jìn)行關(guān)聯(lián),通過ofstream,ifstream,fstream對(duì)象進(jìn)行對(duì)文件的讀寫操作

    函數(shù):open()

    ?

    [cpp]?view plaincopyprint? ?
  • <span?style="font-family:Times?New?Roman;font-size:16px;">??
  • public?member?function??
  • ??
  • void?open?(?const?char?*?filename,??
  • ????????????ios_base::openmode?mode?=?ios_base::in?|?ios_base::out?);??
  • ??
  • void?open(const?wchar_t?*_Filename,??
  • ????????ios_base::openmode?mode=?ios_base::in?|?ios_base::out,??
  • ????????int?prot?=?ios_base::_Openprot);??
  • ??
  • </span>??
  • 參數(shù): filename?? 操作文件名

    ?

    ?????????? mode??????? 打開文件的方式

    ?????????? prot???????? 打開文件的屬性??????????????????????????? //基本很少用到,在查看資料時(shí),發(fā)現(xiàn)有兩種方式

    打開文件的方式在ios類(所以流式I/O的基類)中定義,有如下幾種方式:

    ?

    ios::in為輸入(讀)而打開文件
    ios::out為輸出(寫)而打開文件
    ios::ate初始位置:文件尾
    ios::app所有輸出附加在文件末尾
    ios::trunc如果文件已存在則先刪除該文件
    ios::binary二進(jìn)制方式

    這些方式是能夠進(jìn)行組合使用的,以“或”運(yùn)算(“|”)的方式:例如

    ?

    [cpp]?view plaincopyprint? ?
  • ofstream?out;??
  • out.open("Hello.txt",?ios::in|ios::out|ios::binary)?????????????????//根據(jù)自己需要進(jìn)行適當(dāng)?shù)倪x取??
  • 打開文件的屬性同樣在ios類中也有定義:

    0普通文件,打開操作
    1只讀文件
    2隱含文件
    4系統(tǒng)文件

    對(duì)于文件的屬性也可以使用“或”運(yùn)算和“+”進(jìn)行組合使用,這里就不做說明了。

    ?

    很多程序中,可能會(huì)碰到ofstream out("Hello.txt"), ifstream in("..."),fstream foi("...")這樣的的使用,并沒有顯式的去調(diào)用open()函數(shù)就進(jìn)行文件的操作,直接調(diào)用了其默認(rèn)的打開方式,因?yàn)樵趕tream類的構(gòu)造函數(shù)中調(diào)用了open()函數(shù),并擁有同樣的構(gòu)造函數(shù),所以在這里可以直接使用流對(duì)象進(jìn)行文件的操作,默認(rèn)方式如下:

    [cpp]?view plaincopyprint? ?
  • <span?style="font-family:Times?New?Roman;font-size:16px;">??
  • ofstream?out("...",?ios::out);??
  • ifstream?in("...",?ios::in);??
  • fstream?foi("...",?ios::in|ios::out);??
  • ??
  • </span>??
  • 當(dāng)使用默認(rèn)方式進(jìn)行對(duì)文件的操作時(shí),你可以使用成員函數(shù)is_open()對(duì)文件是否打開進(jìn)行驗(yàn)證

    ?

    2.關(guān)閉文件

    ?

    當(dāng)文件讀寫操作完成之后,我們必須將文件關(guān)閉以使文件重新變?yōu)榭稍L問的。成員函數(shù)close(),它負(fù)責(zé)將緩存中的數(shù)據(jù)排放出來并關(guān)閉文件。這個(gè)函數(shù)一旦被調(diào)用,原先的流對(duì)象就可以被用來打開其它的文件了,這個(gè)文件也就可以重新被其它的進(jìn)程所訪問了。為防止流對(duì)象被銷毀時(shí)還聯(lián)系著打開的文件,析構(gòu)函數(shù)將會(huì)自動(dòng)調(diào)用關(guān)閉函數(shù)close。

    ?

    3.文本文件的讀寫

    ?

    類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的。這就是為什么 fstream 的對(duì)象可以使用其父類的成員來訪問數(shù)據(jù)。

    一般來說,我們將使用這些類與同控制臺(tái)(console)交互同樣的成員函數(shù)(cin 和 cout)來進(jìn)行輸入輸出。如下面的例題所示,我們使用重載的插入操作符<<:

    ?

    [cpp]?view plaincopyprint? ?
  • ??//?writing?on?a?text?file??
  • ?#include?<fiostream.h>??
  • ?int?main?()?{??
  • ?????ofstream?out("out.txt");??
  • ?????if?(out.is_open())???
  • ????{??
  • ?????????out?<<?"This?is?a?line.\n";??
  • ?????????out?<<?"This?is?another?line.\n";??
  • ?????????out.close();??
  • ?????}??
  • ?????return?0;??
  • ?}??
  • //結(jié)果:?在out.txt中寫入:??
  • This?is?a?line.??
  • This?is?another?line???
  • ?

    從文件中讀入數(shù)據(jù)也可以用與 cin>>的使用同樣的方法:

    ?

    [cpp]?view plaincopyprint? ?
  • //?reading?a?text?file??
  • ???#include?<iostream.h>??
  • ???#include?<fstream.h>??
  • ???#include?<stdlib.h>??
  • ?????
  • ???int?main?()?{??
  • ???????char?buffer[256];??
  • ???????ifstream?in("test.txt");??
  • ???????if?(!?in.is_open())??
  • ???????{?cout?<<?"Error?opening?file";?exit?(1);?}??
  • ???????while?(!in.eof()?)??
  • ???????{??
  • ???????????in.getline?(buffer,100);??
  • ???????????cout?<<?buffer?<<?endl;??
  • ???????}??
  • ???????return?0;??
  • ???}??
  • ???//結(jié)果?在屏幕上輸出??
  • ????This?is?a?line.??
  • ????This?is?another?line??
  • ?

    上面的例子讀入一個(gè)文本文件的內(nèi)容,然后將它打印到屏幕上。注意我們使用了一個(gè)新的成員函數(shù)叫做eof ,它是ifstream 從類 ios 中繼承過來的,當(dāng)?shù)竭_(dá)文件末尾時(shí)返回true 。

    狀態(tài)標(biāo)志符的驗(yàn)證(Verification of state flags)

    除了eof()以外,還有一些驗(yàn)證流的狀態(tài)的成員函數(shù)(所有都返回bool型返回值):

    • bad()

      如果在讀寫過程中出錯(cuò),返回 true 。例如:當(dāng)我們要對(duì)一個(gè)不是打開為寫狀態(tài)的文件進(jìn)行寫入時(shí),或者我們要寫入的設(shè)備沒有剩余空間的時(shí)候。

    • fail()

      除了與bad() 同樣的情況下會(huì)返回 true 以外,加上格式錯(cuò)誤時(shí)也返回true ,例如當(dāng)想要讀入一個(gè)整數(shù),而獲得了一個(gè)字母的時(shí)候。

    • eof()

      如果讀文件到達(dá)文件末尾,返回true。

    • good()

      這是最通用的:如果調(diào)用以上任何一個(gè)函數(shù)返回true 的話,此函數(shù)返回 false 。

    要想重置以上成員函數(shù)所檢查的狀態(tài)標(biāo)志,你可以使用成員函數(shù)clear(),沒有參數(shù)。

    ?

    獲得和設(shè)置流指針(get and put stream pointers)

    所有輸入/輸出流對(duì)象(i/o streams objects)都有至少一個(gè)流指針:

    • ifstream, 類似istream, 有一個(gè)被稱為get pointer的指針,指向下一個(gè)將被讀取的元素。
    • ofstream, 類似 ostream, 有一個(gè)指針 put pointer ,指向?qū)懭胂乱粋€(gè)元素的位置。
    • fstream, 類似 iostream, 同時(shí)繼承了get 和 put

    我們可以通過使用以下成員函數(shù)來讀出或配置這些指向流中讀寫位置的流指針:

    • tellg() 和 tellp()

      這兩個(gè)成員函數(shù)不用傳入?yún)?shù),返回pos_type 類型的值(根據(jù)ANSI-C++ 標(biāo)準(zhǔn)) ,就是一個(gè)整數(shù),代表當(dāng)前get 流指針的位置 (用tellg) 或 put 流指針的位置(用tellp).

    • seekg() 和seekp()
    • seekp:設(shè)置輸出文件流的文件流指針位置
    • seekg:設(shè)置輸入文件流的文件流指針位置
    • 這對(duì)函數(shù)分別用來改變流指針get 和put的位置。兩個(gè)函數(shù)都被重載為兩種不同的原型:

      seekg ( pos_type position );
      seekp ( pos_type position );

      使用這個(gè)原型,流指針被改變?yōu)橹赶驈奈募_始計(jì)算的一個(gè)絕對(duì)位置。要求傳入的參數(shù)類型與函數(shù) tellg 和tellp 的返回值類型相同。

      seekg ( off_type offset, seekdir direction );
      seekp ( off_type offset, seekdir direction );

      使用這個(gè)原型可以指定由參數(shù)direction決定的一個(gè)具體的指針開始計(jì)算的一個(gè)位移(offset)。它可以是:

      ios::beg從流開始位置計(jì)算的位移
      ios::cur從流指針當(dāng)前位置開始計(jì)算的位移
      ios::end從流末尾處開始計(jì)算的位移

    流指針 get 和 put 的值對(duì)文本文件(text file)和二進(jìn)制文件(binary file)的計(jì)算方法都是不同的,因?yàn)槲谋灸J降奈募心承┨厥庾址赡鼙恍薷摹S捎谶@個(gè)原因,建議對(duì)以文本文件模式打開的文件總是使用seekg 和 seekp的第一種原型,而且不要對(duì)tellg 或 tellp 的返回值進(jìn)行修改。對(duì)二進(jìn)制文件,你可以任意使用這些函數(shù),應(yīng)該不會(huì)有任何意外的行為產(chǎn)生。

    以下例子使用這些函數(shù)來獲得一個(gè)二進(jìn)制文件的大小:?

    ?

    [cpp]?view plaincopyprint? ?
  • //?obtaining?file?size??
  • ???#include?<iostream.h>??
  • ???#include?<fstream.h>??
  • ?????
  • ???const?char?*?filename?=?"test.txt";??
  • ?????
  • ???int?main?()?{??
  • ???????long?l,m;??
  • ???????ifstream?in(filename,?ios::in|ios::binary);??
  • ???????l?=?in.tellg();??
  • ???????in.seekg?(0,?ios::end);??
  • ???????m?=?in.tellg();??
  • ???????in.close();??
  • ???????cout?<<?"size?of?"?<<?filename;??
  • ???????cout?<<?"?is?"?<<?(m-l)?<<?"?bytes.\n";??
  • ???????return?0;??
  • ???}??
  • ????
  • ??//結(jié)果:??
  • ??size?of?example.txt?is?40?bytes.??


  • ?

    ?

    ?

    4.二進(jìn)制文件

    在二進(jìn)制文件中,使用<< 和>>,以及函數(shù)(如getline)來操作符輸入和輸出數(shù)據(jù),沒有什么實(shí)際意義,雖然它們是符合語法的。

    文件流包括兩個(gè)為順序讀寫數(shù)據(jù)特殊設(shè)計(jì)的成員函數(shù):write 和 read。第一個(gè)函數(shù) (write) 是ostream 的一個(gè)成員函數(shù),都是被ofstream所繼承。而read 是istream 的一個(gè)成員函數(shù),被ifstream 所繼承。類 fstream 的對(duì)象同時(shí)擁有這兩個(gè)函數(shù)。它們的原型是:

    write ( char * buffer, streamsize size );
    read ( char * buffer, streamsize size );

    這里 buffer 是一塊內(nèi)存的地址,用來存儲(chǔ)或讀出數(shù)據(jù)。參數(shù)size 是一個(gè)整數(shù)值,表示要從緩存(buffer)中讀出或?qū)懭氲淖址麛?shù)。

    ?

    [cpp]?view plaincopyprint? ?
  • //?reading?binary?file??
  • ????#include?<iostream>??
  • ????#include?<fstream.h>??
  • ??????
  • ????const?char?*?filename?=?"test.txt";??
  • ??????
  • ????int?main?()?{??
  • ????????char?*?buffer;??
  • ????????long?size;??
  • ????????ifstream?in?(filename,?ios::in|ios::binary|ios::ate);??
  • ????????size?=?in.tellg();??
  • ????????in.seekg?(0,?ios::beg);??
  • ????????buffer?=?new?char?[size];??
  • ????????in.read?(buffer,?size);??
  • ????????in.close();??
  • ??????????
  • ????????cout?<<?"the?complete?file?is?in?a?buffer";??
  • ??????????
  • ????????delete[]?buffer;??
  • ????????return?0;??
  • ????}??
  • ????//運(yùn)行結(jié)果:??
  • ????The?complete?file?is?in?a?buffer??
  • ?

    ?

    ?

    5.緩存和同步(Buffers and Synchronization)

    當(dāng)我們對(duì)文件流進(jìn)行操作的時(shí)候,它們與一個(gè)streambuf 類型的緩存(buffer)聯(lián)系在一起。這個(gè)緩存(buffer)實(shí)際是一塊內(nèi)存空間,作為流(stream)和物理文件的媒介。例如,對(duì)于一個(gè)輸出流, 每次成員函數(shù)put (寫一個(gè)單個(gè)字符)被調(diào)用,這個(gè)字符不是直接被寫入該輸出流所對(duì)應(yīng)的物理文件中的,而是首先被插入到該流的緩存(buffer)中。

    當(dāng)緩存被排放出來(flush)時(shí),它里面的所有數(shù)據(jù)或者被寫入物理媒質(zhì)中(如果是一個(gè)輸出流的話),或者簡單的被抹掉(如果是一個(gè)輸入流的話)。這個(gè)過程稱為同步(synchronization),它會(huì)在以下任一情況下發(fā)生:

      • 當(dāng)文件被關(guān)閉時(shí):?在文件被關(guān)閉之前,所有還沒有被完全寫出或讀取的緩存都將被同步。
      • 當(dāng)緩存buffer 滿時(shí):緩存Buffers 有一定的空間限制。當(dāng)緩存滿時(shí),它會(huì)被自動(dòng)同步。
      • 控制符明確指明:當(dāng)遇到流中某些特定的控制符時(shí),同步會(huì)發(fā)生。這些控制符包括:flush 和endl。
      • 明確調(diào)用函數(shù)sync():?調(diào)用成員函數(shù)sync() (無參數(shù))可以引發(fā)立即同步。這個(gè)函數(shù)返回一個(gè)int 值,等于-1 表示流沒有聯(lián)系的緩存或操作失敗。

    轉(zhuǎn)載于:https://www.cnblogs.com/Anita-z/p/3807480.html

    總結(jié)

    以上是生活随笔為你收集整理的c++文件读写相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。