日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 移动和获取文件读写指针

發布時間:2025/3/12 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++ 移动和获取文件读写指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。