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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态

發(fā)布時間:2024/8/5 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、文件流

ofstream,由ostream派生而來,用于寫文件
ifstream,由istream派生而來, 用于讀文件
fstream,由iostream派生而來,用于讀寫文件


二、打開文件

說明了流對象之后,可使用函數(shù)open()打開文件。文件的打開即是在流與文件之間建立一個連接
函數(shù)原型

void open(const char * filename, int mode = ios::out,int prot = _SH_DENYNO);

參數(shù)
filename:文件的名稱,可以包含(絕對和相對)路徑
mode:文件打開模式
prot:保護(hù)模式


(一)、文件打開模式

打開方式描述

ios::in打開一個供讀取的文件(ifstream流的默認(rèn)值)

ios::out打開一個供寫入的文件(ofstream流的默認(rèn)值)
ios::app在寫之前找到文件尾
ios::ate打開文件后立即將文件定位在文件尾
ios::trunc廢棄當(dāng)前文件內(nèi)容
ios::nocreate(已不再支持)如果要打開的文件并不存在,那么以此參數(shù)調(diào)用open()函數(shù)將無法進(jìn)行
ios::noreplace (已不再支持)如果要打開的文件已存在,試圖用open()函數(shù)打開時將返回一個錯誤。
ios::binary以二進(jìn)制的形式打開一個文件,默認(rèn)為文本文件


(二)、保護(hù)模式

#define _SH_DENYRW 0x10 /* deny read/write mode */拒絕對文件進(jìn)行讀寫
#define _SH_DENYWR 0x20 /* deny write mode */拒絕寫入文件
#define _SH_DENYRD 0x30 /* deny read mode */拒絕文件的讀取權(quán)限
#define _SH_DENYNO 0x40 /* deny none mode */讀取和寫入許可
#define _SH_SECURE 0x80 /* secure mode */共享讀取,獨占寫入

注意:假設(shè)A進(jìn)程以_SH_DENYRW 打開,那么是B進(jìn)程不能再對文件進(jìn)行讀寫。


(三)、文件打開模式的有效組合



上述所有的打開模式組合還可以添加ate模式。對這些模式添加ate模只會改變文件打開時的初始定位,在第一次讀或
寫之前,將文件定位于文件末尾處。


(四)、文件打開的幾點說明

1、文件打開也可以通過構(gòu)造函數(shù)打開,例如:

ofstream fout(“out.txt“,ios::out);

2、文件的打開方式可以為上述的一個枚舉常量,也可以為多個枚舉常量構(gòu)成的按位或表達(dá)式。
3、使用open成員函數(shù)打開一個文件時,若由字符指針參數(shù)所指定的文件不存在,則建立該文件。(out)
4、當(dāng)打開方式中不含有ios::ate或ios::app選項時,則文件指針被自動移到文件的開始位置,即字節(jié)地址為0的位置。

5、從效果上看ofstream指定out模式等同于指定了out和trunc模式
6、默認(rèn)情況下,fstream對象以in和out模式同時打開。
7、當(dāng)文件同時以in和out打開時不會清空
8、如果只使用out模式,而不指定in模式,則文件會清空現(xiàn)有數(shù)據(jù)。
9、如果同時指定了out與app,不會清空
10、如果打開文件時指定了trunc模式,則無論是否同時指定了in模式,文件同樣會被清空


三、流狀態(tài)



對應(yīng)于這個標(biāo)志字各狀態(tài)位,ios類還提供了以下成員函數(shù)來檢測或設(shè)置流的狀態(tài):


bool rdstate(); //返回流的當(dāng)前狀態(tài)標(biāo)志字
bool eof(); //返回非0值表示到達(dá)文件尾
bool fail(); //返回非0值表示操作失敗
bool bad(); //返回非0值表示出現(xiàn)錯誤
bool good(); //返回非0值表示流操作正常
bool clear(int flag=0); //將流的狀態(tài)設(shè)置為flag


為提高程序的可靠性,應(yīng)在程序中檢測I/O流的操作是否正常。當(dāng)檢測到流操作出現(xiàn)錯誤時,可以通過異常處理來解決問題。


四、文件的關(guān)閉


每個文件流類中都提供有一個關(guān)閉文件的成員函數(shù)close()
功能:當(dāng)打開的文件操作結(jié)束后,就需要關(guān)閉它,使文件流與對應(yīng)的物理文件斷開聯(lián)系,并能夠保證最后輸出到文件緩沖區(qū)中的內(nèi)容,無論是否已滿,都將立即寫入到對應(yīng)的物理文件中

函數(shù)原型:void close();

文件流對應(yīng)的文件被關(guān)閉后,還可以利用該文件流調(diào)用open成員函數(shù)打開其他的文件,最好先clear 一下。


C++ Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

#include<cassert>


#include<iostream>


#include<fstream>

using
namespacestd;

intmain(
void)

{


/******************************************************/


//若不存在文件,會創(chuàng)建文件

//ofstreamfout;

//fout.open("test.txt");
ofstreamfout(
"test.txt",ios::out|ios::app);


//判斷流狀態(tài)

//if(fout.is_open())

//{

//cout<<"succ"<<endl;

//}

//else

//cout<<"failed"<<endl;



//if(fout.good())

//{

//cout<<"succ"<<endl;

//}

//else

//cout<<"failed"<<endl;



//if(fout)

//{

//cout<<"succ"<<endl;

//}

//else

//cout<<"failed"<<endl;



//if(!fout)

//{

//cout<<"failed"<<endl;

//}

//else

//cout<<"succ"<<endl;


assert(fout);

fout.close();


/************************************************************/


//若文件不存在,不會創(chuàng)建文件
ifstreamfin(
"test2.txt");


//assert(fin);//文件不存在,斷言失敗


fin.close();


/**********************************************************/


//ofstreamfout1("test3.txt",ios::in|ios::out|ios::ate);

//ofstreamfout2("test3.txt",ios::in|ios::out|ios::ate);



//ofstreamfout1("test3.txt",ios::in|ios::out|ios::app);

//ofstreamfout2("test3.txt",ios::in|ios::out|ios::app);



//app和ate可以共存,以app為準(zhǔn)
ofstreamfout1(
"test3.txt",ios::in|ios::out|ios::app|ios::ate);

ofstreamfout2(
"test3.txt",ios::in|ios::out|ios::app|ios::ate);

assert(fout1);

assert(fout2);

fout1<<
"X";

fout2<<
"Y";
//Y輸出在X的后面


fout1.close();

fout2.close();


/****************************************************************/


//app與trunc不能共存,流狀態(tài)為fail
ofstreamfout3(
"test.txt",ios::out|ios::app|ios::trunc);


if(fout3.good())

{

cout<<
"good"<<endl;

}


if(fout3.bad())

{

cout<<
"bad"<<endl;

}


if(fout3.fail())

{

cout<<
"fail"<<endl;

}


if(fout3.eof())

{

cout<<
"eof"<<endl;

}

fout3.clear();

fout3.open(
"test.txt");
//clear之后能夠重新open

if(fout3)

{

cout<<
"opensucc"<<endl;

}


else

cout<<
"openfailed"<<endl;

fout3.close();


return
0;

}

參考:

C++ primer 第四版
Effective C++ 3rd
C++編程規(guī)范


總結(jié)

以上是生活随笔為你收集整理的从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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