Có hai cách tiếp cận để giải quyết vấn đề này , cách thứ nhất sử dụng vị trí tuyệt đối của dòng gọi là streampos , cách thứ hai là sử dụng hàm có cách thức làm việc giống như hàm fseek() của ngôn ngữ C.
Cách tiếp cận streampos đòi hỏi chúng ta trước tiên cần phải sử dụng một hàm chỉ chỗ (tell): tellp() cho mô ̣t đối tượng ostream và tellg() mô ̣t đối tượng istream. Hàm chỉ chỗ này sẽ trả về một giá trị streampos mà sau đóc chúng ta có thể sử dụng với hàm seekp() đối với một đối tượng ostream và seekg () đối với một đối tượng istream khi chúng ta muốn nhẩy tới vi ̣ trí đó của file.
Cách tiếp cận thứ hai sử dụng các phiên bản overload của các hàm seekp () và
seekg(). Tham số thứ nhất được truyền vào là số byte di chuyển , đó có thể là một số nguyên âm hoă ̣c nguyên dương.. Tham số thứ hai là hướng tìm kiếm:
ios::beg Từ đầu dòng
ios::cur Từ vi ̣ trí hiê ̣n ta ̣i
ios::end Từ cuối dòng
Vídụ minh họa:
//: C02:Seeking.cpp // Seeking in iostreams #include <iostream.h> #include <fstream.h>
49 ifstream in(argv[1]);
in.seekg(0, ios::end); // Cuối file
streampos sp = in.tellg(); // kích thước file
cout << "file size = " << sp << endl; in.seekg(-sp/10, ios::end);
streampos sp2 = in.tellg();
in.seekg(0, ios::beg); // vị trí bắt đầu file
cout << in.rdbuf(); // in ra cả file
in.seekg(sp2); // di chuyển tới vi ̣ trí streampos // in ra phần còn la ̣i của file
cout << endl << endl << in.rdbuf() << endl; } ///:~
Vì kiểu của streampos được định nghĩa là long nên tellg () sẽ cho ta biết kích thước của file. Hàm rdbuf() trả về con trỏ streambuf() của một đối tượng iostream bất kỳ.