Tìm kiếm trong các dòng vào ra

Một phần của tài liệu Bai giang lap trinh huong doi tuong va c++ (Trang 55 - 56)

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ử du ̣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ử du ̣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ỳ.

Một phần của tài liệu Bai giang lap trinh huong doi tuong va c++ (Trang 55 - 56)