文件的IO操作之文件指针
文件指针介绍
这里面说的文件指针也可以理解为文件内部记录读取或者写入的当前位置,不然程序如何知道下一次该从文件的什么位置开始读取或者写入呢?
在读写文件的时候,每读取或者写入一个字节,磁盘中的文件指针就会向后移动一个字节。可以通过控制指针的位置,以便在我们需要的位置进行读写文件。
文件流提供以下成员函数来读取或配置文件指针:
tellg() 返回读取文件指针的当前位置
tellp() 返回写入文件指针的当前位置
seekg(指针偏移量) 将读取文件指针移到指定位置
seekg(指针偏移量,参照位置) 将读取文件指针移到指定位置
seekp(指针偏移量) 将写入文件指针移到指定位置
seekp(指针偏移量,参照位置) 将写入文件指针移到指定位置
这些成员函数名和参数,容易混淆,下面就简单解释一下:
备注:以上函数中的最后一个字母不是g就是p,代表什么意思呢?其中,g代表get,表示读取;p代表put,表示写入。
另外,函数参数中的“文件中的位置”和“指针偏移量”为 long整型,以字节为单位。“参照位置”是一个有以下值的枚举:
ios::beg 文件开头计算偏移量(beg是begin的缩写)
ios::cur 文件当前位置计算偏移量(cur是current的缩写)
ios::end 文件结尾计算偏移量
其中,函数seekg(指针偏移量) 和 seekp(指针偏移量),默认从文件开头计算偏移量
代码示例
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream FileWrite("C:\\Users\\hgq15\\Desktop\\File.txt");
int var1 = 2000;
int place1 = 0;
place1 = FileWrite.tellp(); // 这里求解的地址是相对地址,不是绝对地址
cout << "place1 = " << place1 << endl;
FileWrite << var1 << endl; // endl相当于"\n\t+flush"(回车换行+清空缓存区)
int place2 = 0;
place2 = FileWrite.tellp();
cout << "place2 = " << place2 << endl;
FileWrite << var1 + 1 << endl;
FileWrite.close();
ifstream FileRead("C:\\Users\\hgq15\\Desktop\\File.txt");
var1 = 0;
place1 = 0;
place1 = FileRead.tellg();
FileRead >> var1;
cout << "var1 = " << var1 << ";place1 = " << place1 << endl;
FileRead.seekg(sizeof(var1) + 2, ios::beg);// 相对于开始,指针偏移place1+2个单位
int var2 = 0;
place2 = 0;
FileRead >> var2;
place2 = FileRead.tellg();
cout << "var2 = " << var2 << ";place2 = " << place2 << endl;
FileRead.close();
}