檔案的隨機讀寫也就是說檔案指標可以隨意移動。
檔案的操作方式:
順序讀寫:檔案指標只能從頭移動到尾。
隨機讀寫:檔案指標可以隨意移動,根據需要。
上面的兩種檔案讀寫方式不論是ascii檔案還是二進位制檔案都是可以的。
檔案指標:在磁碟檔案操作中有乙個檔案指標,用來知名當前應進行讀寫的位置,沒有具體變數。
檔案流提供一些有關檔案指標的成員函式:
對於上面的函式中,「檔案中的位置」和「位移量」為long型,以位元組為單位。參照位置可以是下面三者之一:
ios::beg檔案開頭,只是預設值
ios::cur指標當前的位置
ios::end檔案末尾
比如:file.seekg(3)指標移動到第三個字元的位置
file.seekg(-3,ios_base::cur)向前移動三個字元
file.seekg(3,ios_base::cur)向後移動三個字元 等價於 file.seekg(3,file.tellg())因為file.tellg()就是獲取指標的當前位置也等價於 file.seekg(file.tellg()+3)
例子:從鍵盤輸入10個整數,並將其儲存到資料檔案f1.dat中,再從檔案中將資料讀出來,顯示在螢幕上。具體**如下:
需要注意的是iofile.seekg(0,ios::beg)這段**的意思是將檔案指標移動到檔案開始位置,其中ios::beg表示的是檔案的起始位置,而0代表偏移量。
上面的檔案開啟方式為可讀可寫方式,所以不能是ifstream 也不能是ofstream而應該是fstream。
隨機訪問二進位制資料檔案:利用成員函式移動指標,隨機地訪問二進位制資料檔案中,任意位置上的資料,還可以修改檔案中的內容。
對於二進位制檔案的讀寫來說,如果是在write之前移動指標的話,用的是seekp;如果在read之前移動指標的話,用的是seekg。
上面的程式中,student.dat這個檔案在記憶體中是如何儲存的,在二進位制檔案student2.dat中就是如何儲存的。
二進位制檔案節省空間:用計算機內儲存形式進行儲存
保密:看不懂
對於上面的程式來說,如果有1000000個資料的話,那麼將這些資料都讀進記憶體中的話會導致占用記憶體太大,計算機執行變慢,所以不太安全;
安全的做法是檔案放在磁碟中,用哪個資料就取出哪個資料;
同時還有乙個問題就是上面的程式中,如果增加乙個資料或者刪除乙個資料可能會造成大量資料需要向前移動或者向後移動,因此引入索引+隨機訪問的方案。具體流程如下:
1. 將關鍵字和偏移量一對一建立索引;
2. 將索引檔案匯入到記憶體中;
3.如果想查詢某條資料,先從索引中查詢到對應的偏移量然後從磁碟中取出就可以了。
4.還可以隨索引進行排序,從而可以使用高效演算法進行查詢。
上面方案的優點在於:
空間優化(索引檔案比資料檔案小很多),時間優化(將磁碟內容讀入到記憶體中就需要占用很大的記憶體)
用有序的索引查無序的資料;
資料更新時資料和索引的同步。
location=studentsindex[i].offset;
datafile.seekg(location,ios::beg);
datafile.read((char*)&stu.sizeof(student))
上面這段程式就是利用索引中的偏移量offset來查詢資料;
二進位制檔案的優點:
1. 便於對資料進行隨機訪問(尤其和索引配合)
2. 訪問效率高;
3. 可以對檔案進行壓縮處理;
4.儲存密度大;
5. 資料檔案便於保密。
C語言檔案的隨機讀寫
檔案的隨機讀寫 實現隨機檔案的讀寫的關鍵是要按要求移動位置指標,這稱為檔案的定位 檔案定位函式 rewind 和 fseek 移動檔案內部位置指標的函式主要有 rewind 和 fseek rewind 用來將位置指標移動到檔案的開頭,前面以多次使用過,他的原型為 void rewind file ...
C語言之隨機讀寫檔案
一 獲取位置指示器 二 初始化位置指示器 將位置指示器初始化後,後續的檔案讀寫操作與所選檔案讀寫型別一致 檔案讀寫型別請看 c語言之檔案操作 三 設定位置指示器 引數 含義stream 該引數是乙個file物件的指標,指定乙個待操作的檔案流 offset 指定從whence引數的位置起偏移多少個位元...
隨機讀寫 vs 順序讀寫
資訊儲存在硬碟裡,把它拆開也看不見裡面有任何東西,只有些碟片。假設,你用顯微鏡把碟片放大,會看見碟片表面凹凸不平,凸起的地方被磁化,凹的地方是沒有被磁化 凸起的地方代表數字1 磁化為1 凹的地方代表數字0。因此硬碟可以以二進位制來儲存表示文字 等資訊。機械盤 資料是儲存的扇區的,讀寫是依靠磁頭的擺動...