在文件中有一个文件指针。?我们通过控制文件指针的位置,来实现随机读取文件中的数据。文件指针在哪我们就从文件的哪个位置开始读取数据。
?
通过传入两个参数来实现位置设置,第一个参数:距离相应位置的偏移字节数?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第二个参数:? ?相对位置??
相对位置: 一般使用三个。?
ios::beg | 表示相对于文件的开头位置 |
ios::cur | 相对于文件指针所在的当前位置 |
ios:end | 相对于文件的尾部位置 |
偏移字节数:?正数:向右偏移(文件结尾处),? ?负数:向左偏移(文件开始处)
注意:? 偏移字节数,尽量不要太大,超出文件的范围(尤其是用负数的时候)。?
int main(void) {
ifstream io;
string data;
io.open("data.txt");
if (!io.is_open()) return 1;
// 设置文件指针的位置
io.seekg(-10,ios::end); // 将文件指针设置为距离文件结尾10个字节的位置
// 这时候我们读取文件中的数据,就是从距离文件末尾10字节的位置读取数据
getline(io, data);
cout << data << endl;
system("pause");
return 0;
}
读取结果:?
?
上面使用的负数,表示将文件指针设置到距离文件末尾10个字节的位置,这样我们读取文件就从这个位置开始读取数据。?(其它的设置也是同理)
?
这个函数常用的一个场景是:返回文件的大小。? (和seekg()结合)
?我们可以通过seekg()先将文件指针移动到文件末尾,然后再通过tellg()返回指针到文件开头的字节大小,这样就能会的文件的大小了。
int main(void) {
ifstream io;
io.open("data.txt");
if (!io.is_open()) return 1;
// 设置文件指针的位置
io.seekg(0,ios::end); // 将文件指针移动到距离文件末尾0个字节的位置,也就是文件末尾
// 返回文件指针到文件开头的字节数(获取文件的大小)
int count = io.tellg();
cout << count << endl; // 20个字节
system("pause");
return 0;
}
?
上面两个都是在读取文件数据的时候进行文件指针的偏移。?
?
使用一个例子说明: 我们在文件中写 “123456” 。 然后控制文件指针,在数据的中间输入ABC。
int main(void) {
ofstream io;
io.open("data.txt");
if (!io.is_open()) return 1;
io << "123456";
// 设置文件指针的位置
io.seekp(4,ios::beg); // 在输入文件的时候,将指针移动到距离文件开头4个字节的位置。
// 然后在文件指针的位置写入数据
io << "ABC";
system("pause");
return 0;
}
?