Hàm Seekg() trong C++

Ham Seekg Trong C



Trong lập trình C++, hàm seekg() cung cấp trợ giúp trong luồng tệp. Nó là thành viên của thư viện iostream và bạn sẽ tìm thấy nó trong tiêu đề . Chức năng này cho phép người lập trình thao tác nơi bắt đầu thao tác nhập tiếp theo, từ đó hợp lý hóa quy trình làm việc với các tệp. Phương thức seekg() cho phép bạn chuyển đến một vị trí cụ thể trong tệp, điều này rất có giá trị khi bạn cần đọc hoặc xử lý dữ liệu không được sắp xếp tuần tự. Cho dù bạn muốn đọc từ đầu, giữa hay cuối tệp, seekg() đều cung cấp tính linh hoạt cần thiết cho các tác vụ đó. Trong suốt hướng dẫn này, chúng ta sẽ đi sâu vào cách các hàm seekg() trong C++ cho phép truy xuất dữ liệu từ nhiều điểm khác nhau trong một tệp.

Cú pháp và tham số của hàm Seekg() trong C++

Seekg() có thể được triển khai bằng hai cú pháp:

1. Cú pháp Streampos

suối & tìm kiếm ( bài đăng trực tuyến ) ;

Cú pháp này chỉ lấy một tham số, vị trí, đại diện cho vị trí của con trỏ trong bộ đệm luồng. Nó đại diện cho một giá trị “int” và thuộc loại luồng.







2. Cú pháp offset và hướng

suối & tìm kiếm ( thường xuyên tắt dòng , ios_base :: tìm kiếm là bụi bẩn ) ;

Cú pháp này lấy hai tham số làm đầu vào: offset và Direction. Tham số “ofst” là một số nguyên thuộc loại luồng cho biết độ lệch trong bộ đệm của luồng. Tham số “dirt” tìm kiếm phương hướng.



  • ios_base::beg: Offset ngay từ đầu bộ đệm của luồng.
  • ios_base::cur: Offset so với vị trí hiện tại trong vùng đệm của luồng.
  • ios_base::end: Bù đắp từ bộ đệm cuối cùng của luồng.

Hàm seekg() trong C++ thao tác với con trỏ tệp, cho phép lập trình viên định vị nó tại một vị trí cụ thể trong tệp. Nó trả về sự sửa đổi của đối tượng “istream” (*this) và điều chỉnh con trỏ tệp cho phù hợp.



Xử lý lỗi và ngoại lệ trong hàm C++ Seekg()

Hàm seekg() trong C++ đảm bảo sự đảm bảo cơ bản cho việc xử lý ngoại lệ, duy trì tính hợp lệ của đối tượng nếu xảy ra ngoại lệ. Nó có thể đưa ra các ngoại lệ 'lỗi' khi cờ trạng thái lỗi thiếu thông tin và hàm này có trách nhiệm nắm bắt và quản lý các ngoại lệ này, đưa ra lại chúng nếu một bit xấu được đặt trong lệnh gọi cuối cùng.





Hơn nữa, một sự cố phổ biến với seekg() xảy ra khi nó đến cuối tệp (EOF), khiến con trỏ không được đặt và gây ra lỗi. Phương thức clear() được sử dụng để đặt lại con trỏ và giải quyết các lỗi liên quan đến EOF để giải quyết vấn đề này. Ngoài ra, seekg() có thể có nguy cơ thay đổi đối tượng luồng trong môi trường đa luồng, đòi hỏi phải thận trọng và triển khai các cơ chế đồng bộ hóa để giảm thiểu các thay đổi đối tượng “ngoài luồng” tiềm ẩn.

Ví dụ 1: Khái niệm cơ bản về Seekg()

Trong ví dụ đầu tiên, chúng tôi sẽ giải thích những điều cơ bản về hàm seekg() trong C++. Mã của chương trình C++ được đưa ra như sau. Hãy xem trước và sau đó chúng ta sẽ chuyển sang phần giải thích từng phần của mã.



#include

#include

sử dụng không gian tên std ;

int chủ yếu ( int argc , ký tự ** argv ) {

fstream sgFile ( 'seekgFile.txt' , ios :: TRONG | ios :: ngoài | ios :: Thân cây ) ;

sgFile << 'hàm tìm kiếm()' ;

sgFile. tìm kiếm ( số 8 , ios :: ăn xin ) ;

ký tự sgArray [ số 8 ] ;

sgFile. đọc ( sgArray , số 8 ) ;

sgArray [ số 8 ] = 0 ;

cout << sgArray << kết thúc ;

sgFile. đóng ( ) ;

}

Chương trình bao gồm hai tệp tiêu đề cần thiết – – tương ứng để xử lý tệp và các hoạt động đầu vào/đầu ra. Sau đó, “using namespace std;” câu lệnh được bao gồm, cho phép các định danh C++ tiêu chuẩn mà không cần chỉ định rõ ràng vùng tên. Cuối cùng, hàm chính bắt đầu, là điểm vào của chương trình, lấy các đối số dòng lệnh (argc và argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Ở đây, “sgFile”, một đối tượng của lớp “fstream”, được tạo, đại diện cho một luồng tệp. Tệp có tên “seekgFile.txt” được liên kết với luồng tệp. Luồng tệp được mở cho đầu vào (ios::in) đầu ra (ios::out). Nếu tệp tồn tại, nội dung của nó sẽ bị cắt bớt (ios::trunc).

sgFile << “hàm seekg()”; – Chuỗi “hàm seekg()” được ghi vào tệp bằng toán tử “<<”.

sgFile.seekg(8, ios::beg); – Hàm seekg() được sử dụng để đặt con trỏ get ở vị trí thứ 8 tính từ đầu (ios::beg) của tệp.

sgFile.read(sgArray, 8); – Hàm “read” được sử dụng để đọc 8 ký tự từ vị trí hiện tại của con trỏ get vào “sgArray”.

sgArray[8] = 0; – Null chấm dứt mảng ký tự để đảm bảo xử lý chuỗi thích hợp.

cout << sgArray << endl; – Nội dung của “sgArray” (8 ký tự được đọc từ tệp) được hiển thị trên bảng điều khiển bằng cout.

sgFile.close(); – Hàm close() được sử dụng để đóng luồng tập tin.

Đầu ra của chương trình này dự kiến ​​sẽ là “chức năng”. Hãy để chúng tôi kiểm tra nó trong đoạn đầu ra sau:

Mã tạo ra một luồng tệp được liên kết với tệp “seekgFile.txt” ghi một chuỗi vào tệp, tìm kiếm vị trí thứ 8 ngay từ đầu, đọc tám ký tự và xuất ra nội dung đã đọc. Cuối cùng, luồng tập tin được đóng lại.

Ví dụ 2: Điều hướng động

Hãy xem xét một tình huống trong đó bạn phải tính toán động độ lệch seekg(). Hãy để chúng tôi hiểu cách tính toán phần bù động với sự trợ giúp của một ví dụ về mã.

#include

#include

sử dụng không gian tên std ;

int chủ yếu ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

int bù lại = số 8 ;

sgFile. tìm kiếm ( bù lại , ios :: đặt ) ;

ký tự đệm [ số 8 ] ;

sgFile. đọc ( đệm , số 8 ) ;

cout << 'Nội dung: ' << đệm << kết thúc ;

sgFile. đóng ( ) ;

trở lại 0 ;

}

Như bạn có thể thấy, chúng ta đang đọc nội dung từ cùng một tệp mà chúng ta đã tạo trong ví dụ trước, “seekgFile.txt”. Hàm seekg() đặt con trỏ get ở vị trí hiện tại (ios::cur) trong tệp và nó được di chuyển theo phần bù được tính toán (8 ký tự). Hàm read() đọc tám ký tự từ vị trí hiện tại của con trỏ get vào bộ đệm.

Với nội dung của tệp “hàm seekg()” và độ lệch của tám ký tự, chương trình sẽ xuất ra chuỗi con bắt đầu từ ký tự thứ 9 của tệp. Vì vậy, kết quả mong đợi của chương trình là “chức năng”. Hãy để chúng tôi xác nhận nó trong đầu ra đã cho sau:

Ví dụ này thể hiện tính linh hoạt của seekg() bằng cách tính toán độ lệch một cách linh hoạt.

Ví dụ 3: Điều hướng từ cuối

Trong ví dụ này, chúng tôi sẽ trình bày cách đọc dữ liệu trong một tệp từ cuối tệp. Ở đây, seekg() được sử dụng để điều hướng từ cuối tệp. Độ lệch âm cho biết vị trí có liên quan đến điểm cuối. Xem đoạn mã đã cho sau:

#include

#include

sử dụng không gian tên std ;

int chủ yếu ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

sgFile. tìm kiếm ( - 4 , ios :: kết thúc ) ;

ký tự đệm [ số 8 ] ;

sgFile. đọc ( đệm , số 8 ) ;

cout << 'Nội dung: ' << đệm << kết thúc ;

sgFile. đóng ( ) ;

trở lại 0 ;

}

Chương trình C++ này mở một tệp có tên “seekgFile.txt”, di chuyển con trỏ get gồm bốn ký tự lùi về phía sau từ cuối tệp bằng cách sử dụng sgFile.seekg(-4, ios::end), đọc tám ký tự tiếp theo từ vị trí đó vào bộ đệm, sau đó in nội dung của bộ đệm ra bàn điều khiển. Với nội dung của tệp là “hàm seekg()”, kết quả mong đợi là “ction”. Hãy để chúng tôi khớp đầu ra trong ảnh chụp màn hình của đầu ra sau:

Phần kết luận

Tóm lại, seekg() nổi lên như một tài sản có giá trị để điều hướng các luồng tệp một cách chính xác. Thông qua khả năng tìm kiếm các vị trí tùy ý, tính toán linh hoạt các khoảng lệch và điều hướng từ các điểm khác nhau trong một tệp, seekg() trao quyền cho các nhà phát triển xử lý các hoạt động của tệp một cách hiệu quả. Như chúng ta đã thấy trong các ví dụ, việc thành thạo seekg() sẽ nâng cao khả năng kiểm soát và tính linh hoạt của bạn khi làm việc với các luồng tệp trong C++. Tuy nhiên, nó đòi hỏi phải xem xét cẩn thận việc xử lý ngoại lệ và các kịch bản chạy đua dữ liệu tiềm ẩn để đảm bảo hoạt động của tệp mạnh mẽ và không có lỗi trong C++.