中國大學MOOC程序設計與算法(三):C++ 面向對象程序設計 第七週 輸入輸出和模板 筆記 之 文件讀寫(一)

第七週 輸入輸出和模板
1.輸入輸出流相關的類
2.用流操縱算子控制輸出格式
3.文件讀寫(一)
4.文件讀寫(二)
5.函數模板
6.類模板
7.類模板與派生、友元和靜態成員變量

3.文件讀寫(一)

文件和流是一回事,可以將順序文件看作一個有限字符構成的順序字符流,然後像對cin, cout 一樣的讀寫。回顧一下輸入輸出流類的結構層次:
在這裏插入圖片描述
istream是用於輸入的流類,cin就是該類的對象。
ostream是用於輸出的流類,cout就是該類的對象。
ifstream是用於從文件讀取數據的類。
ifstream是用於向文件寫入數據的類。
iostream是既能用於輸入,又能用於輸出的類。
fstream 是既能從文件讀取數據,又能向文件寫入數據的類。
ifstream和ifstream有的成員fstream 都有。

創建文件

#include <fstream> // 包含頭文件
ofstream outFile(“clients.dat”, ios::out|ios::binary);//構造函數

//創建文件
– clients.dat” 要創建的文件的名字
– ios::out 文件打開方式
• ios:out 輸出到文件, 如果這個文件已經存在,則刪除原有內容
• ios::app 輸出到文件, 如果這個文件已經存在,則保留原有內容,總是在尾部添加
– ios::binary 以二進制文件格式打開文件

也可以先創建ofstream對象,再用 open函數打開

ofstream fout;
fout.open("test.out",ios::out|ios::binary);

判斷打開是否成功:(如果文件名不合法、內存空間不足、新建文件和已存在只讀文件同名等情況會創建失敗)

if!fout){
	cout << “File open error!<<endl;
}

文件名可以給出絕對路徑,也可以給相對路徑。沒有交代路徑信息,就是在當前文件夾(可執行文件所在文件夾)下找文件。

文件名的絕對路徑和相對路徑

絕對路徑:
“c:\tmp\mydir\some.txt”
相對路徑:
“\tmp\mydir\some.txt”:當前盤符的根目錄下的tmp\dir\some.txt
“tmp\mydir\some.txt”:當前文件夾的tmp子文件夾裏面的……
“…\tmp\mydir\some.txt”:當前文件夾的父文件夾下面的tmp子文件夾裏面的……
“…\…\tmp\mydir\some.txt”:當前文件夾的父文件夾的父文件夾下面的tmp子文件夾裏面的……

文件的讀寫指針

對於輸入文件,有一個讀指針;
對於輸出文件,有一個寫指針;
對於輸入輸出文件,有一個讀寫指針;
指針用來標識文件操作的當前位置, 該指針在哪裏,讀寫操作就在哪裏進行。

寫指針例子:

ofstream fout("a1.out",ios::app); //以添加方式打開
long location = fout.tellp(); //取得寫指針的位置
location = 10;
fout.seekp(location);  // 將寫指針移動到第10個字節處
fout.seekp(location,ios::beg); //從頭數location,location爲正數
fout.seekp(location,ios::cur); //從當前位置數location,location負值往前,正值往後
fout.seekp(location,ios::end); //從尾部數location,location 爲負值

讀指針例子:

ifstream fin(“a1.in”,ios::ate);
//打開文件,ios::ate表示定位文件指針到文件尾,意義是可以取文件長度
long location = fin.tellg(); //取得讀指針的位置,這就是文件的字節長度
location = 10L;
fin.seekg(location); // 將讀指針移動到第10個字節處
fin.seekg(location,ios::beg); //從頭數location
fin.seekg(location,ios::cur); //從當前位置數location
fin.seekg(location,ios::end); //從尾部數location
location 可以爲負值

顯式關閉文件

ifstream fin(“test.dat”,ios::in);
fin.close();
ofstream fout(“test.dat”,ios::out);
fout.close();

字符文件讀寫

因爲文件流也是流,所以流的成員函數和流操作算子也同樣適用於文件流。
寫一個程序,將文件 in.txt 裏面的整數排序後,輸出到out.txt
例如,若in.txt 的內容爲:
1 234 9 45 6 879
則下面本程序後,生成的out.txt的內容爲:
1 6 9 45 234 879

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
	vector<int> v;
	ifstream srcFile("in.txt",ios::in);
	ofstream destFile("out.txt",ios::out);
	int x;
	while( srcFile >> x )
		v.push_back(x);
	sort(v.begin(),v.end());
	for( int i = 0;i < v.size();i ++ )
		destFile << v[i] << " ";
	destFile.close();
	srcFile.close();
	return 0;
}

讀寫文件時打開的文件一定要關閉,否則會出問題。
比如寫文件後如果不關閉,可能會導致寫入的內容沒有刻到硬盤上,而只是存在內存中,隨後消失了,後果是很多內容沒有真的寫下來。原因是,訪問內存比訪問硬盤要快得多,爲了效率,寫入文件時是先存在內存緩衝區的,等到存滿了再刻到硬盤上,關閉文件會出發這個操作,但是如果不關閉可能在刻到硬盤之前,應該要寫入的內容就在內存上被覆蓋而消失了。
再比如,通常操作系統能同時打開的文件數是有上限的,如果只打開文件不關閉導致達到上限,接下來就無法打開任何文件了。
等等。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章