C++的IO流的函数
一.輸出文件流成員函數
1.輸出流的open函數
????要使用一個輸出文件流(ofstream),必須在構造函數或open函數中把該流與一個特定的磁盤文件關聯起來。在各種情況下,描述文件的參量是相同的。
當你打開一個與輸出流關聯.的文件時,通常指定一個open_mode標志,如下表所示。可以用按位OR(|)運算符組合這些標志,它們作為枚舉器定義在ios類中。
表??輸出文件流文件打開模式
標??志 功 ?? 能
ios::app 打開一個輸出文件用于在文件尾添加數據
ios::ate 打開一個現存文件(用于輸入或輸出)并查找到結尾
ios::in 打開一個輸入文件對于一個ofstream文件,使用ios::in作為一個openmode可避免刪除一個現存文件中現有的內容 ios::out????打開二個文件,用于輸出。對于所有ofstream對象,此模式是隱含指定的 ios::nocreate????如果一個文件存在則打開它,否則該操作失敗 i。
s::noreplace 如果一個文件不存在則作為新文件打開它,如果文件已存在,則該操作失敗
ios::trunc 打開一個文件,如果它已經存在則刪除其中原有的內容如果指定了ios::out,但沒有指定iOs::ate、iOs::app和ios::in,則隱含為此模式
ios::binary 以二進制模式打開一個文件(缺省是文本模式)
有三個公共輸出流涉及模式選項:
?建立一個文件,如果該文件己存在,則刪除舊的版本:
ostream ofile("FILENAME");//缺省模式是ios::out
ofstream ofile("FILENAME",ios::out);//與上一句等效
?添加記錄到一個現存文件中,如果文件不存在便建立一個新文件:
ofstream ofile(“FiILENAME”,ios::app);
?使用同一個流先后打開不同的文件(在同一時刻只有一個是打開的):
ofstream ofile();
ofile.open("FTILE1",ios::in)????//打開文件FILEl
…//????向文件FILEl
輸出 ofile.close();????//關閉FILEl
ofile.open("FILE2",ios::in);????//打開文件FILE2
…//????向文件FILE2輸出
ofile.close();????//關閉FILE2
//當對象ofile離開它的作用域時便消亡
2.put函數??
put函數把一個字符寫到輸出流中,下面兩個語句缺省是相同的,但第二個受該流的格式化參量的影響:
cout.put(‘A’);????//精確地輸出一個字符
cout<<"A";????//輸出一個字符,但此前設置的寬度和填充方式在此起作用
3.write函數
write函數把一個內存中的一塊內容寫到一個輸出文件流中,長度參數指出寫的字節數。下面的例子建立一個輸出文件流并將Date結構的二進制值寫入文件:
例?? 向文件輸出
#i nclude<fstream.h>
struct Date????
{
????int mo,da,yr;
};????
void main()
{????
????Date dt={6,10,92};
????ofstream tfile("date.dat",ios::binary);
????tfile.write((char*)&dt,sizeof dt);
}
write函數當遇到空字符時并不停止,因此能夠寫入完整的類結構,該函數帶兩個參量,一個char指針(指向內存數據的起始地址)和一個所寫的字節數。注意在該結構對象的地址之前需要char*做強制類型轉換。
4.seekp和tellp函數????
一個輸出文件流保存一個內部指針指出下一次寫數據的位置。seekp成員函數設置這個指針,因此可以以隨機方式向磁盤文件輸出。tellp成員函數返回該文件位置指針值。
5.輸出流的close函數??
close成員函數關閉與一個輸出文件流關聯的磁盤文件。文件使用完畢后必須將其關閉以完成所有磁盤輸出。雖然ofstream析構函數(destructor)會自動完成關閉,但如果需要在同一流對象上打開另外的文件,就需要使用close函數。????
如果構造函數或open成員函數打開了該文件,輸出流析構函數自動關閉一個流的文件。
6.錯誤處理函數
錯誤處理成員函數的作用是在寫到一個流時進行錯誤處理。各函數及其功能如下表所示。????
錯誤處理成員函數及其功能
函??數 功能及返回值
bad 如果出現一個不可恢復的錯誤,則返回一個非0值
fail 如果出現一個不可恢復的錯誤或一個預期的條件,例如一個轉換錯誤或文件未找到,用返回一個非0值。在用零參量調用clear之后可能經常恢復處理
good 如果沒有錯誤條件(不可恢復的或其他)和沒有設置文件結尾標志,則返回一個非0值
eof 遇到文件結尾條件,則返回一個非0值
clear 設置內部錯誤狀態,如果用缺省參量調用,則清除所有錯誤位
rdstate 返回當前錯誤狀態
??????????????????????????
! 運算符經過了重載,它與fail函數執行相同的功能,因此表達式if(! cout)等價于 if (cout.fail())。
void*()運算符也是經過重載的,與!運算符相反,因此表達式if(cout)等價于if(! cout.fail())。
void*()運算符不等價于good,因為它不檢測文件結尾。
(四)二進制輸出文件
最初設計流的目的是用于文本,因此缺省的輸出模式是文本方式。在以文本模式輸出時,若遇到換行符(十進制10),便自動被擴充為回車換行符(十進制13)。這種自動擴充有時可能出問題,請看下列程序:
#i nclude<fstream.h>
int iarray[2]={99,10};
void main()
{
????ofstream os("test.dat");
????os.write((char??*)iarray,sizeof(iarray));
}??
??
當執行程序,向文件中輸出時,10會被自動轉換成13,然而這里的轉換顯然不是我們需要的。要想解決這一問題,就要采用二進制模式輸出。使用二進制模式輸出時,其中所寫的字符是不轉換的。使用二進制模式輸出到文件有下列幾種方法,
(1)以通常方式構造一個流,然后使用setmode成員函數,在文件打開后改變模式,例如:
????ofstream ofs("test.dat");
????ofs.setmode(filebuf::binary);
ofs.write((char*)iarray,4);????//向二進制文件中寫入4字節數據
(2)使用ofstream構造函數中的模式參量指定二進制輸出模式,例如:
#i nclude<fstream.h>
#i nclude<fcntl.h>
#i nclude<io.h>
int iarray[2]={99,10};
void main()
{
ofstream ofs("test.dat",ios::binary);
ofs.write((char*)iarray,4);????//向二進制文件中寫入4字節數據
}
(3)使用二進制操作符代替setmode成員函數:
ofs<<binary;
若使用text操作符便把流切換到文本轉換模式。
(4)使用open函數帶一個二進制模式標志打開文件,例如:
filedesc fd=open("test.dat",OBINARY|OCREAT|OWRONLY);
ofstream ofs(fd);
ofs.write((char*)iarray,4);????//向二進制文件中寫入4字節數據
二.輸入流成員函數
輸人流成員函數用于從磁盤文件中輸入,這些成員函數包括:
?????open函數????
?????get函數????
?????getline函數
?????read函數????
?????seekg和tellg函數
?????close函數????
1.輸入流的open函數
如果要使用一個輸入文件流(ifstream),必須在構造函數中或者使用open函數把該流與一個特定磁盤文件關聯起來。無論哪種方式,參量是相同的。
當打開與一個輸入流關聯的文件時,通常要指定一個模式標志。模式標志如下表所示,該標志可以用按位OR(|)運算符進行組合。
表??輸入文件流文件打開模式
ios::in????打開文件用于輸入(缺省)
ios::nocreate?? 如果文件不存在,該函數失敗
ios::binary 以二進制模式(缺省模式是文本模式)打開文件
注意:如果需要測試文件是否存在,必須在打開文件時指定ios::nocreate模式,然后使用fail成員函數確定:
????istream ifile("FILENAME",ios::nocreate);
????if (ifile.fail())
????//The file does not exist...
2.get函數????
非格式化get函數的功能與提取運算符(>>)很相像,主要的不同點是get函數在讀人數據時包括空白字符,而提取運算符在缺省情況下拒絕接受空白字符。
例??get函數應用舉例
#i nclude<iostream.h>
void main()????
{
????char ch;
????while((ch=cin.get())!=EOF)
??cout.put(ch);
}
運行時如果輸入:
abc??xyz??123
則輸出:
abc??xyz??123
3.getline函數
getline成員函數的功能是允許從輸人流中讀取多個字符,并且允許指定輸入終止字符(缺省值是換行字符),在讀取完成后,從讀取的內容中刪除該終止字符。
例?? 為輸入流指定一個終止字符
本程序連續讀人一串字符,直到遇到字符‘t’時停止,字符個數最多不超過99個。
??#i nclude<iostream.h>
void main()
{????
????char line[100];
????cout<<"Type a 1ine terminated by "t""<<endl;
????cin.getline(1ine,100,"t");
????cout<<line;
}
4.read函數
read成員函數從一個文件讀字節到一個指定的存儲器區域,由長度參數確定要讀的字節數。如果給出長度參數,當遇到文件結束或者在文本模式文件中遇到文件結束標記字符時讀結束。
例?? 從一個payroll文件讀一個二進制記錄到一個結構中
????#i nclude<io.h>
void main()????
{
????struct
????{
??double salary;
??char name[23];
}employee;
ifstream is("payroll",ios::binary|ios::nocreate);
????if (is)
????{
????is.read((char*)&employee,sizeof(employee));
????cout<<employee.name<<" "<<employee.salary<<endl;
????}
????else
????{
????cout<<"ERROR:Cannot openfile"payroll"."<<endl;
????}????
}????
這里假設數據記錄是通過指定的結構嚴格格式化的,并且設有終止的回車或換行字符。
5.seekg和tellg函數????
在輸入文件流中,保留著一個指向文件中下一個將讀數據的位置的內部指針,可以用 seekg函數來設置這個指針。????
????例?? 用seekg函數設置位置指針
??#i nclude<fstream.h>
void main()
{????
char ch;
ifstream tfile("payroll",ios::binary | ios::nocreate);
if(tfile)????
{
??tfile.seekg(8);????
??while(tfile.good())????
??{
?? //遇到文件結束或讀取操作失敗時結束讀操作
?? tfile.get(ch);
?? if (!ch)break;????//如果沒有讀到則退出循環
?? cout<<ch;
??}
????}
????else
????{
??cout<<"ERROR;Cannot open file "payroll"."<<endl;
}????
}
??
使用seekg可以實現面向記錄的數據管理系統,用固定長度的記錄尺寸乘以記錄號便得到相對于文件末尾的字節位置,然后使用get讀這個記錄。
tellg成員函數返回當前文件讀指針的位置,這個值是streampos類型,該typedef結構定義在iostream.h中。
例?? 讀一個文件并顯示出其中空格的位置
#i nclude<fstream.h>
void main()
{????
????char ch;
????ifstream tfile("payroll",ios::binary | ios::nocreate);
????if (tfile)????
????{????
??while(tfile.good())????
??{
?? streampos here=tfile.tellg();
?? tfile.get(ch);
?? if(ch==" ")
????cout<<"\nPosition"<<here<<"is a space";
??}
????}????
????else
????{????
?? cout<<"ERROR:Cannot open file "payroll"."<<endl;
????}
}????
6.輸入流的close函數
close成員函數關閉與一個輸入文件流關聯的磁盤文件。
雖然ifstream類的析構函數可以自動關閉文件,但是如果需要使用同一流對象打開另一文件,則首先要用close函數關閉當前文件。
四、輸入/輸出流
一個iostream對象可以是數據的源或目的。兩個重要的I/O流類都是從iostream派生的,它們是fstream和strstream。這些類繼承了前面描述的stream和ostream類的功能。
fstream類支持磁盤文件的輸入和輸出。如果你需要在同一個程序中從一個特定磁盤文件讀和寫到該磁盤文件,可以構造一個fstream對象。一個istream對象是有兩個邏輯子流的單個流,兩個子流一個用于輸入,另一個用于輸出。詳細說明請讀者參考聯機幫助或運行庫參考手冊
總結
以上是生活随笔為你收集整理的C++的IO流的函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脊髓损伤后身体出现僵硬感觉是正常的吗?
- 下一篇: MySQL注入中报错的利用