在C++中,對文件的操作是通過stream的子類fstream(file stream)來實現的,在頭文件 <fstream> 中定義
一、打開文件
fstream類的成員函數open(),原形:void open(const char *filename,int mode,int access)
filename:打開的文件名字 mode:打開文件的方式 access:打開文件的屬性
打開文件的模式:
in 打開文件做讀操作 out 寫操作,文件會清空 app 在文件尾追加 ate 定位在文件尾
trunc 如果文件存在,把文件尾長度設爲0(清空已存在的文件流)
nocreate 文件不存在時打開失敗 noreplace 打開文件如果存在則失敗
binary 以二進制模式進行IO操作
打開文件的屬性:
0:普通文件,打開訪問 1:只讀文件
2:隱藏文件 4:系統文件
可以用“或(|)”或者“+”把以上屬性連接起來
如果open函數只有文件名---一個參數,則以讀/寫普通文件打開
例:file1.open( "c://config.sys "); <======> file1.open( "c://config.sys ",in|out,0);
二、關閉文件
fstream提供成員函數close()來操作
三、讀寫操作
1、file2 < < "I love you "; //向文件寫入字符串“I love you”
int i;
file2> > i; //從文件讀出一個整數值i
2、二進制文件的讀寫
(1) put()
put()函數向流寫入一個字符。原形爲ofstream &put(char ch);
file1.put( 'c ');就是向流寫一個字符 'c '
(2) get()
get()函數有三種重載形式:
第一種:ifstream &get(char &ch):從流中讀取一個字符,結果保存在引用ch中。如果到文件 尾則返回空字符
第二種:file2.get(x);表示從文件中讀取一個字符,保存在x中。達到文件尾則返回EOF
第三種:ifstream &get(char *buf,int num,char delim= '/n '); 把字符讀入由buf指向的數 組,直到讀入num個字符或遇到由delim指定的字符。如果沒有delim這個參數,就使用默認置 換行符 '/n '
四、文件定位
C++的文件定位分爲讀位置和寫位置的定位
seekg()設置讀位置 seekp()設置寫位置
istream &seekg(streamoff offset,seek_dir origin);
ostream &seekp(streamoff offset,seek_dir origin);
offset 偏移量 seek_dir 移動的基準位置
seek_dir是值爲枚舉類型:beg 文件開頭;cur 當前位置;end 結尾
以上兩個函數一般用於二進制文件
file1.seekg(1234,cur); //把文件的讀指針從當前位置後移1234個字節
ifstream input;
vector <string> ::const_iterator iter=files.begin();
while( iter!=files.end() )
{
if( !input )
{
break;
}
while( input> > s )
{
process(s);
}
input.close();
input.clear(); //打開已存在的流對象,必須在每次偏移循環時關閉和清空
++iter;
}
每個IO類定義了三個iostate類型的常量值,分別表示特定的位模式:
badbit標誌着系統級的故障,如無法恢復的讀寫錯誤
failbit標誌着希望獲得數值型數據而輸入了字符,這種導致設置failbit的問題通常可以修正
eofbit標誌着遇到文件結束符,此時同時還設置了failbit
流的狀態由bad、fail、eof和good操作揭示。clear和setstate操作用於改變條件成員狀態
int ival;
//read cin and test only for EOF;loopis executed even if there are other IO failures
while( cin> > ival,cin.eof() ) //先讀取,然後返回是否到達文件結束
{
if( cin.bad() )
{
throw runtime_error( "IO stream corrupted ");
}
if( cin.fail() )
{
cerr < < "bad data,try again ";
cin.clear(istream::failbit); //reset the stream
continue;
}
}
輸入緩衝區的刷新:
cout < < "hi " < <flush; //flush the buffer;adds no data
cout < < "hi " < <ends; //insert a null,then flushes the buffer
cout < < "hi " < <endl; //insert a newline,then flushes the buffer
cout < < unitbuf < < "fisrt " < < "second " < < nounitbuf;//每次執行完寫操作符後都刷新流
關於C++文件讀取
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.