相關的頭文件:#include <fstream>ios
須要相關的類數組
fstream提供三種類,實現C++對文件的操做函數
ofstream:寫操做,由ostream引伸而來spa
ifstream:讀操做,由istream引伸而來 操作系統
fstream :同時讀寫操做,由iostream引伸而來 指針
文件的類型:文本文件 和 二進制文件對象
文件讀寫的步驟:內存
一、包含的頭文件:#include <fstream>get
二、建立流原型
三、打開文件(文件和流關聯)
四、讀寫 (寫操做:<<,put( ), write( ) 讀操做: >> , get( ),getline( ), read( ))
五、關閉文件:把緩衝區數據完整地寫入文件, 添加文件結束標誌, 切斷流對象和外部文件的鏈接
文件的讀寫:
一、文本文件的讀寫:
方法:
一次性讀寫若干字符
1)使用運算符<< 和 >>進行讀寫
功能:
<< 能實現以行爲單位寫入文件
>> 不能一行爲單位讀入內存,老是以空格、Tab、回車結束,而是以單詞爲單位
代碼:
函數功能:使用<< ,寫入文件一行字符
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile<<"abc def ghi";
OpenFile.close();
system("pause");
}
運行結果:文件中寫入內容:abc def ghi
函數功能:使用>>,從文件讀入一個單詞
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
const int len=20;
char str[len];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile>>str;
cout<<str<<endl;
OpenFile.close();
system("pause");
}
運行結果:str的內容爲abc,而不是abc def ghi(見空格中止)
2)使用運算符<<(寫)和getline()進行讀寫
功能:
<<:以行爲單位輸入文件
getline():以行爲單位 讀入內存,能一次讀入一行
函數原型:istream &getline( char *buffer, streamsize num );
功能:getline( )函數用於從文件讀取num-1個字符到buffer(內存)中,直到下列狀況發生時,讀取結束:
1):num - 1個字符已經讀入
2):碰到一個換行標誌
3):碰到一個EOF
代碼:
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
const int len=20;
char str[len];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile.getline(str,20);
cout<<str<<endl;
OpenFile.close();
system("pause");
}
運行結果:str的內容爲abc def ghi (一直把一行讀完)
一次讀寫一個字符:
使用get( )和put( )函數
函數聲明:istream& get(char &c);
函數功能:使用 get( )函數 把字符1輸入到文件
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch='1';
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile.put(ch);
OpenFile.close();
system("pause");
}
運行結果:把字符1寫入文件
函數功能:使用 put( )函數 把文件中第一個字符輸入內存
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch;
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile.get(ch);
cout<<ch;
OpenFile.close();
system("pause");
}
運行結果:把字符1從文件中讀到ch(內存)中
二、二進制文件的讀寫:
1)使用運算符get( ) 和 put( )讀寫一個字節
功能:
get( ) :在文件中讀取一個字節到內存
函數原型:ifstream &get(char ch)
put( ) :在內存中寫入一個字節到文件
函數原型:ofstream &put(char ch)
代碼:
功能:把26個字符寫入文件中
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch='a';
ofstream OpenFile("file.txt",ios::binary);
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
for (int i=0;i<26;i++)
{
OpenFile.put(ch);
ch++;
}
OpenFile.close();
system("pause");
}
運行結果:文件內容爲abcdefghijklmnopqlst...z
功能:把文件中的26個字母讀入內存
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch;
ifstream OpenFile("file.txt",ios::binary);
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
while (OpenFile.get(ch))
cout<<ch;
OpenFile.close();
system("pause");
}
運行結果:ch依次爲abc...z
2)使用read()和write()進行讀寫
read( ):
功能:從文件中提取 n 個字節數據,寫入buf指向的地方中
函數聲明:istream & read ( char * buf , int n ) ;
代碼:
函數功能:使用write( )函數,一次從內存向文件寫入一行數據
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch[12]="12 3 456 78";
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile.write(ch,12);
OpenFile.close();
system("pause");
}
運行結果:文件內容12 3 456 78
write( ):
功能:把buf指向的內容取n個字節寫入文件
函數聲明:ostream & ostream :: write ( char * buf , int n ) ;
參數說明:buf表示要寫入內存的地址,傳參時要取地址。n表示要讀入字節的長度
注意:1):該函數遇到空字符時並不中止,於是可以寫入完整的類結構
2):第一個參數一個char型指針(指向內存數據的起始地址),與對象結合使用的時候,要在對象地址以前要char作強制類型轉換。
函數功能:使用write( )函數,一次從文件向內存寫入一行數據
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char ch[12];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
OpenFile.read(ch,12);
cout<<ch;
OpenFile.close();
system("pause");
}
運行結果:數組ch的內容爲12 3 456 78 。
說明:
一、程序再也不使用文件時,爲何要關閉文件?
由於:1)文件緩衝區是一塊小的內存空間.
注意:close ( ) 函數關閉文件,但流對象仍然存在。
二、文件的默認打開方式爲文本文件,要是想以二進制的方式處理,在打開時要用 ios::binary 顯式聲明。
三、針對文本文件操做時,get函數和>>的區別:
if (OpenFile)
{
cout<<"打開文件失敗!";
exit(0);
}
if (OpenFile.fail())
{
cout<<"打開文件錯誤!"<<endl;
exit(0);
}
while (!OpenFile.eof())
{
//文件結束時的代碼
}
while (!OpenFile)
{
//文件結束時的代碼
}
while ( (OpenFile.get(ch) )!=EOF)
{
//成功時候的代碼
}
文本文件的讀寫常使用的方法:使用<<寫入文件,使用getline 和 >> 讀到內存
二進制文件的讀寫常使用的方法:使用istream 類的成員函數read 和write 來實現,
這兩個成員函數的原型爲:
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
參數說明:字符指針 buffer 指向內存中一段存儲空間。len 是讀/寫的字節數。
與對象結合寫入二進制文件時:
write函數調用語句:
輸出文件流對象名.write((char*)& 對象名,sizeof(<對象所屬類名>));
輸出文件流對象名.write((char*)& 對象數組名[下標],sizeof(<對象所屬類名>));
read函數調用語句:
輸入文件流對象名.read((char*)& 對象名,sizeof(<對象所屬類名>));
輸入文件流對象名.read((char*)& 對象數組名[下標],sizeof(<對象所屬類名>));
注意:gcount()函數常常和read函數配合使用,用來得到實際讀取的字節數。
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
//寫文件:二進制存儲1234
int writeNum1 = 1;
int writeNum2 = 2;
int writeNum3 = 3;
int writeNum4 = 4;
ofstream fout("test.txt", ios::out | ios::binary);
fout.write(reinterpret_cast<char *>(&writeNum1), sizeof(int));
fout.write(reinterpret_cast<char *>(&writeNum2), sizeof(int));
fout.write(reinterpret_cast<char *>(&writeNum3), sizeof(int));
fout.write(reinterpret_cast<char *>(&writeNum4), sizeof(int));
fout.close();
//讀文件
ifstream fin("test.txt",ios::in | ios::binary);
if (!fin.good())
{
cout<<"文件打開錯誤"<<endl;
exit(0);
}
int readNum = 0;
//第一次輸出:從第一個數字輸出,結果是1 2 3 4
fin.seekg(0,ios::beg);
while (fin.peek() != EOF)
{
fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));
cout<<readNum<<" ";
}
cout<<endl;
//第二次輸出:從第三個數字輸出,結果是3 4
fin.seekg(2 * sizeof(int),ios::beg);//遊標移動的次數 = 須要處理數的個數 × int佔的字節數
while (fin.peek() != EOF)
{
fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));
cout<<readNum<<" ";
}
cout<<endl;
fin.close();
system("pause");
return 0;
}