Viết tệp nhị phân trong C++

Viet Tep Nhi Phan Trong C



Trong lập trình C++, xử lý các tệp nhị phân là điều cơ bản để lưu trữ và thao tác dữ liệu thô. Cho dù bạn đang làm việc với hình ảnh, tệp âm thanh hay cấu trúc dữ liệu tùy chỉnh, khả năng ghi tệp nhị phân một cách hiệu quả là rất quan trọng. Các tệp nhị phân lưu trữ dữ liệu ở định dạng mà con người không thể đọc được, làm cho chúng phù hợp với nhiều ứng dụng khác nhau như lưu trữ các cấu trúc, hình ảnh phức tạp hoặc bất kỳ dữ liệu nào không tuân theo cách trình bày dựa trên văn bản đơn giản.

C++ cung cấp thư viện để tương tác với các tệp nhị phân, đặc biệt là lớp “ofstream”, để ghi dữ liệu nhị phân. Khả năng này cho phép các nhà phát triển tạo, sửa đổi và quản lý các tệp nhị phân một cách liền mạch. Bài viết này khám phá các phương pháp và kỹ thuật khác nhau để ghi tệp nhị phân trong C++, làm sáng tỏ các ứng dụng và trường hợp sử dụng của chúng.

Viết tệp nhị phân bằng C++

Để lưu dữ liệu vào tệp nhị phân bằng C++, phương thức write() được sử dụng. Hàm này ghi một số byte được chỉ định vào luồng được chỉ định, bắt đầu từ vị trí của con trỏ “put”. Nếu con trỏ “put” ở cuối thì file sẽ được mở rộng. Tuy nhiên, dữ liệu mới sẽ ghi đè các ký tự hiện có nếu con trỏ nằm trong tệp. Trong trường hợp xảy ra lỗi trong quá trình ghi, luồng sẽ được đánh dấu là đang ở trạng thái lỗi. Bây giờ, chúng ta hãy chuyển sang các ví dụ để tìm hiểu cách ghi vào tệp nhị phân bằng cách sử dụng một số hàm C++ đơn giản và được tích hợp sẵn.







Phương pháp 1: Viết tệp nhị phân với dữ liệu có cấu trúc

Bạn có thể cần phải ghi dữ liệu có cấu trúc, chẳng hạn như cấu trúc tùy chỉnh, vào tệp nhị phân trong nhiều trường hợp. Hãy xem xét một ví dụ chứa bản ghi về một người bao gồm tên, chiều cao và tuổi của một người. Xem đoạn mã đã cho sau đây và xem phần giải thích:



#include

#include

cấu trúc Người {

ký tự tên [ năm mươi ] ;

int tuổi ;

gấp đôi chiều cao ;

} ;

int chủ yếu ( ) {

tiêu chuẩn :: ngoài dòng outFile ( 'người.bin' , tiêu chuẩn :: ios :: nhị phân ) ;

nếu như ( ! outFile. đang_mở ( ) ) {

tiêu chuẩn :: cer << 'Lỗi! Không thể mở tập tin để viết!' << tiêu chuẩn :: kết thúc ;

trở lại 1 ;

}

người người1 = { 'Kalsoom Ilyas' , 25 , 1,75 } ;

người người2 = { 'Kalsoom Bajwa' , 30 , 1,68 } ;

outFile. viết ( diễn giải lại_cast < ký tự *> ( & người 1 ) , kích thước của ( người 1 ) ) ;

outFile. viết ( diễn giải lại_cast < ký tự *> ( & người2 ) , kích thước của ( người2 ) ) ;

outFile. đóng ( ) ;

tiêu chuẩn :: cout << 'Hồ sơ của người đó được ghi vào tệp nhị phân thành công.' << tiêu chuẩn :: kết thúc ;

trở lại 0 ;

}

Đây là bản phân tích mã với các chi tiết cụ thể. Chương trình bắt đầu bằng việc xác định cấu trúc tùy chỉnh có tên “Người”. Nó có ba trường: tên, tuổi và chiều cao. Thông tin chi tiết về các trường này như sau:



  • tên: Một chuỗi để lưu trữ tên người (tối đa 50 ký tự)
  • tuổi: Một số nguyên để lưu trữ tuổi của người đó
  • chiều cao: Một đôi để lưu trữ chiều cao của người

Sau khi xác định cấu trúc “Người”, hàm chính bắt đầu là điểm vào của chương trình. Dòng đầu tiên trong chương trình chính sẽ mở một tệp có tên “people.bin”. Chúng tôi sử dụng “std::ofstream” để tạo một tệp có tên “people.bin” để ghi dữ liệu ở định dạng nhị phân. Việc kiểm tra xem file có mở thành công hay không là rất quan trọng. Nếu không, thông báo lỗi sẽ hiển thị và chương trình sẽ dừng. Do đó, với sự trợ giúp của điều kiện “if” và hàm is_open(), chúng ta kiểm tra xem tệp đã mở thành công hay chưa.





Ở đây, hai đối tượng “Person” được tạo. Chúng tôi xác định hai biến, “person1” và “person2”, thuộc loại “Person”. Chúng tôi chỉ định các giá trị tên biến, tuổi và chiều cao cho “Kalsoom Ilyas” và “Kalsoom Bajwa”.

Bây giờ chúng ta có dữ liệu để ghi vào tệp nhị phân, hãy thực hiện hàm thực tế với hàm write(). Chúng tôi sử dụng “outFile.write” để ghi nội dung của từng đối tượng “Person” vào tệp. “reinterpret_cast(&person1)” và “reinterpret_cast(&person2)” chuyển đổi toàn bộ cấu trúc “Person” (bao gồm tất cả các trường của nó) thành một luồng byte liên tục phù hợp để ghi vào tệp nhị phân . Chúng tôi viết kích thước của từng đối tượng “Person” bằng cách sử dụng “sizeof(person1)” và “sizeof(person2)” để đảm bảo rằng tất cả dữ liệu được ghi chính xác.



Sau khi ghi dữ liệu vào tệp, điều quan trọng là phải đóng nó đúng cách để không có dữ liệu nào bị mất do bất kỳ chức năng nào khác. Chúng tôi sử dụng outFile.close() để giải phóng các tài nguyên được liên kết với tệp và đảm bảo rằng dữ liệu được ghi chính xác. Cuối cùng, chúng tôi in một thông báo xác nhận việc ghi dữ liệu thành công vào tệp nhị phân.

Nếu chúng ta giải thích ví dụ này bằng những thuật ngữ đơn giản hơn, hãy tưởng tượng một cuốn sổ đặc biệt chỉ có thể lưu trữ thông tin về mọi người bằng ngôn ngữ bí mật. Mã này tạo ra một kế hoạch chi tiết để sắp xếp thông tin (tên, tuổi, chiều cao). Nó mở cuốn sổ, điền hồ sơ cho hai người, dịch thông tin sang ngôn ngữ bí mật và viết gọn gàng vào bên trong. Sau đó, nó sẽ đóng sổ ghi chép một cách an toàn, bảo quản các cấu hình để sử dụng trong tương lai. Tham khảo đầu ra của chương trình được đưa ra trong ảnh chụp nhanh sau:

Phương pháp 2: Ghi số nguyên vào tệp nhị phân

Trong phương thức này, một mảng các số nguyên được ghi vào một tệp nhị phân có tên là “integers.bin”. “reinterpret_cast” xử lý mảng số nguyên dưới dạng một chuỗi ký tự (byte) để ghi vào tệp. Điều này đặc biệt quan trọng vì các tệp nhị phân xử lý dữ liệu byte thô. Chúng ta hãy xem ví dụ đơn giản sau:

#include

#include

int chủ yếu ( ) {

tiêu chuẩn :: ngoài dòng outFile ( 'số nguyên.bin' , tiêu chuẩn :: ios :: nhị phân ) ;

nếu như ( ! outFile. đang_mở ( ) ) {

tiêu chuẩn :: cer << 'Lỗi! Không thể mở tập tin để viết!' << tiêu chuẩn :: kết thúc ;

trở lại 1 ;

}

int con số [ ] = { 42 , 99 , - 1 , 0 } ;

outFile. viết ( diễn giải lại_cast < ký tự *> ( con số ) , kích thước của ( con số ) ) ;

outFile. đóng ( ) ;

tiêu chuẩn :: cout << 'Các số nguyên đã cho được ghi vào tệp nhị phân thành công.' << tiêu chuẩn :: kết thúc ;

trở lại 0 ;

}

Đây là bản phân tích mã với các chi tiết cụ thể:

“#include ” và “#include ” lần lượt mang đến các công cụ cần thiết để làm việc với tệp và in các thông báo như cin và write(). “std::ofstream outFile(“integers.bin”, std::ios::binary);” mở một tệp nhị phân có tên “integers.bin” chỉ có thể lưu trữ các số ở dạng mã bí mật (định dạng nhị phân). Nó kiểm tra xem tập tin có mở không. Nếu không, một thông báo lỗi sẽ được đưa ra.

Dòng tiếp theo là “int số[] = {42, 99, -1, 0};” định nghĩa một mảng có tên là “numbers” với các số nguyên 42, 99, -1 và 0. “outFile.write(reinterpret_cast(numbers), sizeof(numbers));” cẩn thận dịch các số nguyên sang định dạng nhị phân và ghi chúng vào tệp “integer.bin”. “outFile.close();” đóng tệp một cách chính xác để giữ cho các số nguyên an toàn và có tổ chức. Cuối cùng, một thông báo được in ra để xác nhận rằng các số nguyên đã được lưu trữ thành công trong tệp nhị phân. Tham khảo đầu ra sau của chương trình này để xem kết quả:

Phần kết luận

Viết tệp nhị phân bằng C++ là một kỹ năng quan trọng để xử lý hiệu quả các loại dữ liệu khác nhau. Trong quá trình khám phá cách ghi tệp nhị phân trong C++ này, chúng ta đã tìm hiểu cách sử dụng lớp “ofstream” để xử lý dữ liệu nhị phân một cách hiệu quả. Cho dù xử lý các số nguyên đơn giản hay dữ liệu có cấu trúc bằng cách sử dụng cấu trúc tùy chỉnh, quy trình này đều bao gồm việc mở luồng tệp, ghi dữ liệu ở định dạng nhị phân rồi đóng tệp. Khả năng này cung cấp cho các nhà phát triển C++ sự linh hoạt để làm việc với nhiều loại dữ liệu nhị phân đa dạng, góp phần tạo nên tính linh hoạt của ngôn ngữ trong các ứng dụng từ lập trình cấp hệ thống đến xử lý đa phương tiện.