Hàm Write() trong ngôn ngữ C

Ham Write Trong Ngon Ngu C



Quản lý tệp trong lập trình là một nhiệm vụ mà lập trình viên phải thông thạo. Kiến thức về các chức năng mở, đọc và ghi khác nhau là điều cần thiết vì chúng ta luôn cần chúng để lưu trữ hoặc xử lý thông tin được lưu trữ trong tệp.

Trong bài viết Gợi ý Linux này, bạn sẽ học cách sử dụng hàm write() để ghi tệp.







Chúng tôi sẽ giải thích mọi thứ về ella này, cú pháp của nó, phương thức gọi, đối số đầu vào và đầu ra, loại dữ liệu mà nó chấp nhận trong từng trường hợp và cách khai báo chính xác.



Sau đó, chúng tôi áp dụng những gì đã học bằng cách đưa việc sử dụng hàm này vào các ví dụ thực tế mà chúng tôi đã chuẩn bị cho bạn bằng các đoạn mã và hình ảnh, cho thấy việc sử dụng hàm write() trong ngôn ngữ C.



Để bạn có kiến ​​thức toàn diện về việc sử dụng hàm write(), chúng tôi đã thêm một phần đặc biệt mô tả các lỗi riêng lẻ có thể xảy ra khi sử dụng hàm này, cũng như cách phát hiện và xác định chúng, để bạn có kỹ thuật cần thiết cho một giải pháp nhanh chóng trong trường hợp của họ xảy ra.





Cú pháp của hàm Write() trong ngôn ngữ C

int viết ( int fd , khoảng trống * buf , size_t N ) ;

Mô tả Hàm Write() trong Ngôn ngữ C

Hàm write() ghi vào một tệp đang mở. Hàm này ghi nội dung của bộ đệm được chỉ định bởi “buf” vào tệp được chỉ định bởi bộ mô tả của nó trong đối số đầu vào “fd”. Kích thước của khối được ghi vào tệp phải được chỉ định trong đối số đầu vào “n”.

Để có thể ghi bằng hàm write(), tệp phải được mở bằng hàm open() và được chỉ định trong thuộc tính O_RDONLY hoặc O_RDWR. Nếu không, chức năng này không có tác dụng.



Nếu cuộc gọi thành công, nó sẽ trả về số ký tự được nhập. Nếu xảy ra lỗi trong khi viết, nó sẽ trả về kết quả bằng -1. Mã nhận dạng cho biết lỗi có thể được truy xuất từ ​​biến toàn cục errno được xác định trong tiêu đề “errno.h”.

Sau đó, bạn sẽ tìm thấy một phần trong đó chúng tôi giải thích cách phát hiện và xác định các lỗi phổ biến nhất của chức năng này.

Hàm write() được xác định trong tiêu đề “unistd.h”. Các cờ xác định thuộc tính và chế độ mở tệp được xác định trong “fcntl.h”. Để sử dụng các hàm open() và write(), bạn phải đưa các tiêu đề này vào mã của mình như sau:

#include

#include

Cách ghi vào tệp bằng hàm Write() trong ngôn ngữ C

Trong ví dụ này, chúng tôi viết một tệp văn bản trống có tên “example.txt” mà chúng tôi đã tạo trước đó trong thư mục “Tài liệu”.

Bước đầu tiên là chèn các tiêu đề cần thiết. Bên trong hàm main(), mở tệp bằng hàm open(). Để thực hiện việc này, chúng ta cần khai báo số nguyên “fd” đóng vai trò là bộ mô tả tệp và mảng bộ đệm “buf” gồm 1024 ký tự chứa văn bản mà chúng ta muốn ghi vào tệp. Trong bộ đệm này, chúng tôi lưu trữ đoạn đầu tiên của trang người dùng GCC để ghi nó vào tệp “example.txt”.

Sau khi mở tệp bằng hàm open() ở chế độ đọc/ghi, chúng ta ghi vào tệp bằng cách gọi hàm write() và chuyển bộ mô tả tệp “fd” làm đối số đầu vào đầu tiên, con trỏ “buf” làm đối số đầu vào thứ hai. đối số và kích thước của chuỗi được chứa trong mảng làm đối số thứ ba mà chúng ta có được bằng hàm strlen(). Đây là mã cho ví dụ này:

#include

#include

#include

#include

#include

#include

#include

khoảng trống chủ yếu ( )

{

int fd ;

than đệm [ 1024 ] = 'Khi bạn gọi GCC, nó thường thực hiện tiền xử lý, biên dịch, lắp ráp và liên kết. Các tùy chọn tổng thể cho phép bạn dừng quá trình này ở giai đoạn trung gian. Ví dụ: tùy chọn -c cho biết không chạy trình liên kết. Sau đó, đầu ra bao gồm các tệp đối tượng được xuất bởi trình biên dịch mã chương trình.' ;

fd = mở ( 'Tài liệu/example.txt' , O_RDWR ) ;

viết ( fd , & đệm , strlen ( đệm ) ) ;

đóng ( fd ) ;

}

Trong hình dưới đây, chúng ta thấy quá trình biên dịch và thực thi mã này cùng với tệp đã mở được ghi bởi hàm write():

Cách thêm văn bản vào cuối tệp bằng hàm Write() trong ngôn ngữ C

Khi một tệp được mở bằng cách chỉ định các cờ O_WRONLY hoặc O_RDWR, con trỏ sẽ nhảy đến vị trí đầu tiên và bắt đầu viết từ đó.

Để thêm văn bản vào cuối tệp, văn bản đó phải được chỉ định bằng thao tác logic OR giữa cờ O_WRONLY hoặc O_RDWR và cờ O_ APPEND trong đối số cờ đầu vào của hàm open() khi tệp được mở. Bằng cách này, con trỏ được đặt ở cuối tệp và việc viết bắt đầu từ đó. Ngoài ra, các thuộc tính và chế độ ghi có thể được thay đổi khi tệp được mở bằng hàm fcntl().

Trong hình minh họa sau, bạn có thể thấy một mã thêm văn bản vào cuối tệp mà chúng tôi đã viết trong ví dụ trước:

#include

#include

#include

#include

#include

#include

#include

khoảng trống chủ yếu ( )

{

int fd ;

than đệm [ 1024 ] = 'Văn bản này được thêm vào. Văn bản này được thêm vào.' ;

fd = mở ( 'Tài liệu/example.txt' , O_RDWR | O_APPEND ) ;

viết ( fd , & đệm , strlen ( đệm ) ) ;

đóng ( fd ) ;

}

Hình ảnh sau đây hiển thị văn bản được thêm vào. Như bạn có thể thấy, với phương thức mở này, hàm write() bắt đầu ghi tại vị trí của ký tự cuối cùng được ghi vào tệp:

Cách phát hiện và xác định các lỗi có thể xảy ra khi sử dụng hàm Write() trong ngôn ngữ C

Sử dụng write() có thể tạo ra nhiều lỗi khác nhau. Khi điều này xảy ra, hàm này trả về kết quả bằng -1.

Cách dễ nhất để xác định xem có xảy ra lỗi hay không là sử dụng điều kiện “nếu” trong đó điều kiện là giá trị trả về -1. Bây giờ, hãy xem cách bạn có thể sử dụng phương pháp này để xác định xem có xảy ra lỗi hay không:

int N ;

N = viết ( fd , & đệm , strlen ( đệm ) ) ;

nếu như ( N == - 1 ) {

bản inf ( msgstr 'Đã xảy ra lỗi khi cố ghi tệp.' ) ;

}

Nếu hàm write() trả về có lỗi, nó sẽ chuyển sang câu lệnh “if” và in thông báo, “ Đã xảy ra lỗi khi cố ghi tệp “.

Khi xảy ra lỗi, một mã số sẽ tự động được lưu trữ trong biến toàn cục errno được xác định trong tiêu đề “errno.h”. Mã này có thể được sử dụng để xác định lỗi đã xảy ra.

Sau đây là đoạn trích với các lỗi mà hàm write() có thể tạo ra và được xác định trong tiêu đề “errno.h”, cùng với mô tả ngắn gọn về từng lỗi và giá trị số nguyên liên quan:

Sự định nghĩa Giá trị trong errno Lỗi
LẠI mười một Thử lại.
EBADF 9 Số tệp không chính xác.
EDESTADDRREQ 89 Yêu cầu địa chỉ đích.
EDQUOT 122 Vượt quá hạn ngạch.
LỖI 14 Địa chỉ không chính xác.
EFBIG 27 Tệp quá lớn.
EINTR 4 Cuộc gọi hệ thống bị gián đoạn.
LỰA CHỌN DUY NHẤT 22 Đối số không hợp lệ.
EIO 5 Lỗi IO.
ENOSPC 28 Không còn chỗ trống trên thiết bị.
Phía trên 1 Hoạt động không được phép.

Cách dễ nhất để xác định lỗi là mở một công tắc trong đó biến errno là điều kiện nhảy và mỗi trường hợp là một định nghĩa lỗi.

Tiếp theo, chúng ta hãy xem một ví dụ trong đó chúng ta cố gắng nhập một bộ mô tả có dấu âm, dẫn đến lỗi. Để xác định lỗi, chúng tôi sử dụng điều kiện 'nếu' mà chúng tôi đã thấy trong đoạn mã trước. Để xác định nó, chúng tôi mở một công tắc có ba lỗi phổ biến nhất mà chức năng này có thể tạo ra.

#include

#include

#include

#include

#include

#include

#include

khoảng trống chủ yếu ( )

{

int fd ;

int N ;

than đệm [ 1024 ] = 'Chào thế giới' ;

fd = mở ( 'Tài liệu/example.txt' , O_RDWR ) ;

N = viết ( - 2 , & đệm , strlen ( đệm ) ) ;

nếu như ( N == - 1 ) {

công tắc ( sai lầm ) {

trường hợp EBADF : {

bản inf ( 'Số tệp sai. Lỗi: %i \N ' , sai lầm ) ;

phá vỡ ; }

trường hợp LỰA CHỌN DUY NHẤT : {

bản inf ( 'Đối số không hợp lệ. Lỗi: %i \N ' , sai lầm ) ;

phá vỡ ; }

trường hợp EIO : {

bản inf ( 'Lỗi I/O. Lỗi: %i \N ' , sai lầm ) ;

phá vỡ ; }

}

}

}

Như chúng ta có thể thấy trong hình dưới đây, hàm write() trả về lỗi khi một bộ mô tả không hợp lệ được chuyển làm đối số đầu vào. Giá trị được lấy từ biến errno được sử dụng làm điều kiện nhảy cho phép chúng tôi xác định lỗi khi nhập trường hợp EBADF.

Phần kết luận

Trong bài viết Gợi ý Linux này, chúng tôi đã chỉ cho bạn cách sử dụng hàm write() để ghi vào tệp. Chúng tôi đã chỉ cho bạn cú pháp và mô tả lý thuyết của chức năng này. Chúng tôi cũng đã giải thích các phương pháp phát hiện và xác định lỗi để bạn có các công cụ và kỹ thuật cần thiết để giải quyết nhanh các sự cố này.

Để giúp bạn thấy cách write() hoạt động, chúng tôi đã triển khai việc sử dụng hàm này trong các ví dụ thực tế với các mã và hình ảnh cho thấy việc sử dụng hàm này và các hàm xử lý tệp khác.

Chúng tôi cũng đã hướng dẫn bạn cách chọn chế độ mở tệp để chèn văn bản vào đầu hoặc cuối tệp và các chức năng có sẵn để thay đổi các thuộc tính này.