C++ 移动和获取文件读写指针
在讀寫文件時,有時希望直接跳到文件中的某處開始讀寫,這就需要先將文件的讀寫指針指向該處,然后再進行讀寫。
ifstream 類和 fstream 類有 seekg 成員函數,可以設置文件讀指針的位置;ofstream 類和 fstream 類有 seekp 成員函數,可以設置文件寫指針的位置。所謂“位置”,就是指距離文件開頭有多少個字節。文件開頭的位置是 0。
這兩個函數的原型如下:
ostream & seekp (int offset, int mode); istream & seekg (int offset, int mode);mode 代表文件讀寫指針的設置模式,有以下三種選項:
1 . ios::beg:讓文件讀指針(或寫指針)指向從文件開始向后的 offset 字節處。offset 等于 0 即代表文件開頭。在此情況下,offset 只能是非負數。
2 . ios::cur:在此情況下,offset 為負數則表示將讀指針(或寫指針)從當前位置朝文件開頭方向移動 offset 字節,為正數則表示將讀指針(或寫指針)從當前位置朝文件尾部移動 offset字節,為 0 則不移動。
3 . ios::end:讓文件讀指針(或寫指針)指向從文件結尾往前的 |offset|(offset 的絕對值)字節處。在此情況下,offset 只能是 0 或者負數。
此外,我們還可以得到當前讀寫指針的具體位置:
ifstream 類和 fstream 類還有 tellg 成員函數,能夠返回文件讀指針的位置;ofstream 類和 fstream 類還有 tellp 成員函數,能夠返回文件寫指針的位置。這兩個成員函數的原型如下:
int tellg(); int tellp();要獲取文件長度,可以用 seekg 函數將文件讀指針定位到文件尾部,再用 tellg 函數獲取文件讀指針的位置,此位置即為文件長度。
假設學生記錄文件 students.dat 是按照姓名排好序的,編寫程序,在 students.dat 文件中用折半查找的方法找到姓名為 Jack 的學生記錄,并將其年齡改為 20(假設文件很大,無法全部讀入內存)。程序如下:
#include <iostream> #include <fstream> #include <cstring> using namespace std; class CStudent {public:char szName[20];int age; }; int main() {CStudent s; fstream ioFile("students.dat", ios::in|ios::out);//用既讀又寫的方式打開if(!ioFile) {cout << "error" ;return 0;}ioFile.seekg(0,ios::end); //定位讀指針到文件尾部,//以便用以后tellg 獲取文件長度int L = 0,R; // L是折半查找范圍內第一個記錄的序號// R是折半查找范圍內最后一個記錄的序號R = ioFile.tellg() / sizeof(CStudent) - 1;//首次查找范圍的最后一個記錄的序號就是: 記錄總數- 1do {int mid = (L + R)/2; //要用查找范圍正中的記錄和待查找的名字比對ioFile.seekg(mid *sizeof(CStudent),ios::beg); //定位到正中的記錄ioFile.read((char *)&s, sizeof(s));int tmp = strcmp( s.szName,"Jack");if(tmp == 0) { //找到了s.age = 20;ioFile.seekp(mid*sizeof(CStudent),ios::beg);ioFile.write((char*)&s, sizeof(s));break;}else if (tmp > 0) //繼續到前一半查找R = mid - 1 ;else //繼續到后一半查找L = mid + 1;}while(L <= R);ioFile.close();return 0; }總結
以上是生活随笔為你收集整理的C++ 移动和获取文件读写指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java人民币读法转换
- 下一篇: C++布尔类型