随机读取
文件指针
在文件中有一个文件指针。 我们通过控制文件指针的位置,来实现随机读取文件中的数据。文件指针在哪我们就从文件的哪个位置开始读取数据。
seekg(); // 用于设置文件指针的位置。
通过传入两个参数来实现位置设置,第一个参数:距离相应位置的偏移字节数
第二个参数: 相对位置
相对位置: 一般使用三个。
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个字节的位置,这样我们读取文件就从这个位置开始读取数据。 (其它的设置也是同理)
tellg(); // 此函数返回文件指针当前所在的位置距离文件开头多少个字节。
这个函数常用的一个场景是:返回文件的大小。 (和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;
}
上面两个都是在读取文件数据的时候进行文件指针的偏移。
seekp() // 用于控制输出流,也就是写文件时候,将文件指针移动到相应的位置,在这个位置写数据
使用一个例子说明: 我们在文件中写 “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;
}