【C++grammar】文件I/O流的基本用法
目錄
- 1、輸入輸出類介紹
- 1.C/C++文件操作對(duì)比
- 2.什么是流?
- 3.C++ I/O流類層次
- 4.帶緩沖的輸入輸出
- 5.gcc編譯器cin.in_avail()
- 2、向文件寫(xiě)入數(shù)據(jù)
- 1.寫(xiě)文件小練習(xí)
- 2.如何將信息同時(shí)輸出到文件和屏幕?
- 3、從文件讀數(shù)據(jù)
- 1.檢測(cè)文件是否成功打開(kāi)
- 2.檢測(cè)是否已到文件末尾
- 3.讀取文件小練習(xí)
- 4.bad()函數(shù)能否用來(lái)判斷文件流是否成功打開(kāi)?
1、輸入輸出類介紹
1.C/C++文件操作對(duì)比
2.什么是流?
流是一個(gè)數(shù)據(jù)序列。
一個(gè)流是有兩個(gè)端點(diǎn)的,一邊是data source(數(shù)據(jù)源),一邊是程序。
一個(gè)I / O流表示輸入源或輸出目的地。流可以表示許多不同種類的源和目標(biāo),包括磁盤文件,設(shè)備,其他程序和內(nèi)存陣列。
流支持許多不同類型的數(shù)據(jù),包括簡(jiǎn)單字節(jié),原始數(shù)據(jù)類型,本地化字符和對(duì)象。一些流只是傳遞數(shù)據(jù);其他則以有用的方式操縱和轉(zhuǎn)換數(shù)據(jù)。
無(wú)論它們?cè)趦?nèi)部如何工作,所有流都向使用它們的程序提供相同的簡(jiǎn)單模型:流是數(shù)據(jù)序列。
程序使用輸入流從源中一次讀取一項(xiàng)數(shù)據(jù):
程序使用輸出流將數(shù)據(jù)寫(xiě)入目的地,一次寫(xiě)入一項(xiàng):
摘自:I / O流
3.C++ I/O流類層次
C++的流類主要有五類:
標(biāo)準(zhǔn)輸入輸出流對(duì)象 cin 和 cout 分別是類 istream 和 ostream 的實(shí)例
字符串流:將各種不同的數(shù)據(jù)格式化輸出到一個(gè)字符串中,可以使用I/O操縱器控制格式;反之也可以從字符串中讀入各種不同的數(shù)據(jù)。
4.帶緩沖的輸入輸出
C++的I/O流是有內(nèi)部緩沖區(qū)的。
c = cin.get(void)每次讀取一個(gè)字符并把由Enter鍵生成的換行符留在輸入隊(duì)列中
本部分要展示的內(nèi)容如下:
1、鍵盤輸入一個(gè)字母后回車,實(shí)際進(jìn)入緩沖區(qū)的是兩個(gè)字符
2、使用cin輸入信息后,有換行字符殘留在緩沖區(qū),從而導(dǎo)致return語(yǔ)句前的cin.get()不起作用
5.gcc編譯器cin.in_avail()
在使用gcc編譯器的時(shí)候,存在這樣一種意外的情況:
無(wú)論輸入多少個(gè)字符, cin.in_avail()函數(shù)返回值永遠(yuǎn)是0。
這是由于GCC編譯器中配套的libstdc++實(shí)現(xiàn)中的問(wèn)題(可以看作是標(biāo)準(zhǔn)庫(kù)gcc實(shí)現(xiàn)的一個(gè)bug,或者一個(gè)特性)。
解決辦法是,在使用cin之前,插入下面一行代碼
cin.sync_with_stdio(false);
簡(jiǎn)單解釋原因:GCC的libstdc++默認(rèn)是保證C++的cin與C的stdin同步的。
2、向文件寫(xiě)入數(shù)據(jù)
ofstrem可向文本文件中寫(xiě)數(shù)據(jù).
輸出數(shù)據(jù)的流程:
文件已存在,則直接清除內(nèi)容。
Writing Data to a File – Auto type recognition (自動(dòng)類型識(shí)別)
1.寫(xiě)文件小練習(xí)
本部分要展示的內(nèi)容如下:
1、創(chuàng)建文件輸出流
2、向文件寫(xiě)數(shù)據(jù)
output << “Lilei” << " " << 90.5 << endl;
output << “HanMeimei” << " " << 85 << endl;
3、關(guān)閉文件
4、用文本編輯器打開(kāi)文件,對(duì)比代碼語(yǔ)句檢查結(jié)果
打開(kāi)一個(gè)輸出文件流的方法包括:
2.如何將信息同時(shí)輸出到文件和屏幕?
在軟件的調(diào)試技術(shù)中,很重要的一個(gè)技術(shù)是將軟件運(yùn)行過(guò)程中的一些信息寫(xiě)入到“日志文件”中。但是同時(shí)還要將信息顯示到屏幕上,以方便程序員實(shí)時(shí)查看這些信息。
最簡(jiǎn)單的一種辦法是這樣的:
下面使用streambuf構(gòu)造一個(gè)自己的類,來(lái)實(shí)現(xiàn)這個(gè)功能
#include <streambuf> #include <iostream> #include <fstream>//Linux tee命令用于讀取標(biāo)準(zhǔn)輸入的數(shù)據(jù),并將其內(nèi)容輸出成文件。 //tee指令會(huì)從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),將其內(nèi)容輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時(shí)保存成文件。 class teebuf : public std::streambuf { public:// Construct a streambuf which tees output to both input// streambufs.teebuf(std::streambuf* sb1, std::streambuf* sb2): sb1(sb1), sb2(sb2){} private:// This tee buffer has no buffer. So every character "overflows"// and can be put directly into the teed buffers.virtual int overflow(int c){if (c == EOF){return !EOF;}else{int const r1 = sb1->sputc(c);int const r2 = sb2->sputc(c);return r1 == EOF || r2 == EOF ? EOF : c;}}// Sync both teed buffers.virtual int sync(){int const r1 = sb1->pubsync();int const r2 = sb2->pubsync();return r1 == 0 && r2 == 0 ? 0 : -1;} private:std::streambuf* sb1;std::streambuf* sb2; };class teestream : public std::ostream { public:// Construct an ostream which tees output to the supplied// ostreams.teestream(std::ostream& o1, std::ostream& o2); private:teebuf tbuf; };teestream::teestream(std::ostream& o1, std::ostream& o2): std::ostream(&tbuf), tbuf(o1.rdbuf(), o2.rdbuf()) { }int main() {std::ofstream output("debug.log");//1、創(chuàng)建文件/屏幕輸出流對(duì)象teeteestream tee(std::cout, output);auto x = 1.1;tee << __FILE__ << ":" << __LINE__ << "\t" << "Variable x = " << x;return 0; }效果:
3、從文件讀數(shù)據(jù)
ifstrem可從文本文件中讀數(shù)據(jù),并檢測(cè)文件是否成功打開(kāi)。
了解數(shù)據(jù)格式
若想正確讀出數(shù)據(jù),必須確切了解數(shù)據(jù)的存儲(chǔ)格式。
用流提取運(yùn)算符從文件流中讀數(shù)據(jù),所讀入的信息的長(zhǎng)度與流提取運(yùn)算符右側(cè)的變量的類型有關(guān)。
1.檢測(cè)文件是否成功打開(kāi)
可能出現(xiàn)錯(cuò)誤:
1、讀文件時(shí)文件不存在
2、寫(xiě)文件時(shí)介質(zhì)只讀
檢測(cè)文件是否正確打開(kāi)的方法:
1、open()之后馬上調(diào)用fail()函數(shù)
2、fail()返回true, 文件未打開(kāi)
2.檢測(cè)是否已到文件末尾
若你不知道文件有多少行,還想把他們?nèi)x出來(lái),用eof()函數(shù)檢查是否是文件末尾
由于get函數(shù)返回值是int,所以需要強(qiáng)制類型轉(zhuǎn)換再進(jìn)行屏幕輸出。
3.讀取文件小練習(xí)
本部分要展示的內(nèi)容如下:
1、創(chuàng)建文件輸入流,打開(kāi)文件score.txt
2、用>>從文件讀取數(shù)據(jù)
3、使用fail()函數(shù)檢測(cè)文件是否打開(kāi)
4、將讀文件語(yǔ)句放入循環(huán)中,使用eof()作為循環(huán)條件
5、關(guān)閉文件
4.bad()函數(shù)能否用來(lái)判斷文件流是否成功打開(kāi)?
在ifstream和ofstream類中,除了fail()函數(shù)之外,還有bad()函數(shù)。
那么我們能否用bad()函數(shù)取代fail()函數(shù)判斷流是否成功打開(kāi)?
不能,bad() 如果出現(xiàn)意外的問(wèn)題,如文件受損或硬件故障,最后一次讀取數(shù)據(jù)的時(shí)候發(fā)生了這樣的問(wèn)題,方法bad()將返回true.
總結(jié)
以上是生活随笔為你收集整理的【C++grammar】文件I/O流的基本用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开封看卵巢多囊最好的医院推荐
- 下一篇: 这个签到怎么签啊?