Hàm fgets() trong C
Fgets trong C là một hàm thông dụng. Bài viết sẽ cung cấp cho bạn kiến thức cơ bản về hàm fgets trong C.
Hàm char *fgets(char *str, int n, FILE *stream) trong Thư viện C chuẩn đọc một dòng từ Stream đã cho và lưu trữ nó vào trong chuỗi được trỏ bởi str. Nó dừng khi gặp bất cứ điều kiện nào sau: (n-1) ký tự đã được đọc, ký tự newline (dòng mới) được đọc hoặc bắt gặp end-of-file.
Cách dùng hàm fgets() trong C
Khai báo hàm fgets() trong C
Dưới đây là phần khai báo cho hàm fgets() trong C:
char *fgets(char *str, int n, FILE *stream)
Tham số
str -- Đây là con trỏ tới một mảng các char nơi chuỗi được đọc được lưu trữ.
n -- Đây là số ký tự tối đa được đọc (bao gồm ký tự null cuối cùng). Thường thì độ dài của mảng đã truyền là str được sử dụng.
stream -- Đây là con trỏ tới một đối tượng FILE mà nhận diện Stream, nơi mà các ký tự được đọc từ đó.
Trả về giá trị
Nếu thành công, hàm trả về cùng tham số str. Nếu bắt gặp EOF và không có ký tự nào đã được đọc, nội dung của str vẫn không thay đổi và một con trỏ null được trả về.
Nếu một lỗi xuất hiện, một con trỏ null được trả về.
Ví dụ
Chương trình C sau minh họa cách sử dụng của hàm fgets() trong C:
#include <stdio.h> int main() { FILE *fp; char str[60]; /* mo file de doc */ fp = fopen("baitapc.txt" , "r"); if(fp == NULL) { perror("Xay ra loi trong khi doc file"); return(-1); } if( fgets (str, 60, fp)!=NULL ) { /* Ghi noi dung len stdout */ puts(str); } fclose(fp); return(0); }
Giả sử chúng ta có baitapc.txt với nội dung sau. File này sẽ được sử dụng như là input cho chương trình C ví dụ:
Biên dịch và chạy chương trình C trên sẽ cho kết quả:
So sánh gets() và fgets()
Tính năng | gets() | fgets() |
Kiểm soát kích thước bộ đệm | Không kiểm soát kích thước có thể bị tràn bộ đệm | Cho phép kiểm soát kích thước, ngăn tràn bộ đệm |
Xử lý dòng mới | Bỏ ký tự xuống dòng | Giữ nguyên ký tự xuống dòng |
Nguồn đầu vào | Chỉ có thể đọc từ stdin | Có thể đọc từ nguồn nhập bất kỳ, bao gồm stdin. |
Xử lý lỗi | Không thể phát hiện lỗi hay EOF nên không có cách xử lý lỗi đọc | Trả về NULL khi gặp lỗi hoặc EOF, vì thế, có thể xử lý hiệu quả lỗi đọc |
Trạng thái | Không còn được sử dụng trong C11 trở lên | Được đề xuất và sử dụng rộng rãi |
Những câu hỏi thường gặp về hàm fgets() trong C
Điều gì xảy ra nếu đầu vào vượt quá kích thước bộ đệm trong fgets()?
Nếu độ dài đầu vào vượt quá n-1 ký tự, fgets() sẽ dừng đọc ở n-1 ký tự, để lại phần đầu vào còn lại trong bộ đệm. Phần đầu vào còn lại này có thể được đọc trong các lệnh gọi tiếp theo tới fgets().
Tại sao chuỗi được fgets() đọc đôi khi nhỏ hơn kích thước đã cho?
Nếu đầu vào ngắn hơn n-1 hoặc kết thúc bằng ký tự xuống dòng, chuỗi kết quả sẽ xuất hiện nhỏ hơn.
Tại sao nên sử dụng fgets() thay vì scanf() trong C?
Bất cứ khi nào bạn sử dụng hàm *f, cho dù đó là printf, scanf hay các dẫn xuất của chúng (fprintf, fscanf, v.v...), bạn đang làm nhiều việc hơn bạn có thể nhận ra. Bạn không chỉ đọc (hoặc viết) một cái gì đó, mà - và đây là vấn đề - bạn đang diễn giải nó. Chuỗi định dạng có thể được coi như một loại hàm 'eval' như bạn sẽ thấy nếu lập trình bằng Lisp. Vì vậy, vấn đề với việc chỉ đọc đầu vào từ người dùng và phản hồi lại là một tác nhân độc hại có thể chỉ cần chèn một con trỏ hàm hoặc mã thực thi và, bạn không còn kiểm soát được nữa.
Hàm fgets là viết tắt của file-get-string. Hãy nhớ rằng các tệp có thể là bất cứ thứ gì trên các hệ thống *nix, vì vậy chúng ta có thể sử dụng nó để đọc từ đầu vào chuẩn, một lần nữa, về lý thuyết, nó cũng là một tệp. Điều này cũng làm cho chương trình mạnh mẽ hơn. Quan trọng là, hàm fgets cũng cho phép chúng ta chỉ định độ dài bộ đệm cụ thể, do đó không cho phép bất kỳ cuộc tấn công tràn bộ đệm nào.
Bài trước: Hàm fgetc() trong C
Bài tiếp: Hàm fputc() trong C
Bạn nên đọc
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:


Cũ vẫn chất
-
Cách tải toàn bộ Playlist Video trên Youtube
Hôm qua -
Cách xóa tài khoản Facebook vĩnh viễn trên điện thoại, máy tính
Hôm qua -
Cách cài đặt Python trên Windows, macOS, Linux
Hôm qua -
Trực tâm là gì? Xác định trực tâm trong tam giác
Hôm qua 1 -
Hàng ngày hay hằng ngày? Khi nào dùng 'hàng ngày', khi nào dùng 'hằng ngày'
Hôm qua -
Cách giả lập CASIO FX-580VN X trên máy tính, điện thoại
Hôm qua 1 -
Số thập phân là gì? Các phép tính với số thập phân
Hôm qua -
Cách đánh số trang bỏ trang đầu, đánh số từ trang bất kỳ trong Word chi tiết nhất
Hôm qua -
20+ cách giải phóng RAM trên máy tính Windows 10, reset RAM Win 10 đơn giản nhất
Hôm qua -
Những câu nói cà khịa người yêu cũ, stt cà khịa người yêu cũ bá đạo
Hôm qua 2