Hướng dẫn cách đọc từ các tệp trong C bằng Fread

Với ngôn ngữ lập trình C bạn phải sử dụng hàm thư viện tiêu chuẩn Fread. Để đọc dữ liệu nhị phân từ một luồng tập và lưu trữ nó trong một mảng hoặc bộ nhớ khác. Chức năng này có sẵn trong hầu hết các triển khai của C cho phép truy cập vào hệ thống tệp của hệ điều hành. Trong phần giải thích về hàm Fread này. Bạn đã biết cách đọc từ các tệp trong C bằng Fread chưa? Cùng Box.edu tìm hiểu kỹ hơn nhé! 

Xem thêm: Kiến thức cơ bản về lập trình C – Hướng dẫn sử dụng ngôn ngữ C

Xem thêm: Gợi ý cách tìm trình biên dịch C tốt nhất cho Windows 8

Xem thêm: Hướng dẫn C: Học C trong 20 phút hiệu quả cho người mới

Mục lục bài viết

Mở và đóng tệp

mo-va-dong-tep.jpg

Mở và đóng tệp

Để bạn có thể đọc được một tệp, bạn phải mở nó. Và khi đã sử dụng xong tệp, bạn nên đóng tệp để cho phép các ứng dụng khác truy cập vào. Hai hàm bạn sử dụng ở đây là fopen () và fclose (). 

Fopen () mở một tệp để đọc hoặc ghi và trả về một con trỏ đến một luồng tệp. Nó sẽ chấp nhận hai đối số: đối số đầu tiên là tên tệp (tùy chọn bao gồm cả đường dẫn tệp) sẽ được mở. Thứ hai là chế độ truy cập, có thể là một trong sáu cài đặt. Chế độ truy cập này được sử dụng trong mã mẫu đi kèm với bài viết này là “r”. Đồng thời chế độ này sẽ mở một tệp để đọc. Lưu ý rằng tệp phải tồn tại trong quá trình sử dụng đối số này.

fclose () đóng tệp và giải phóng mọi ổ khóa. Nó sẽ chấp nhận một đối số bao gồm: con trỏ được trả về bởi một cuộc gọi thành công tới fopen ().

Đọc từ các tệp trong C bằng Fread

Với ví dụ bên dưới khi đọc 200 ký tự đầu tiên từ tệp văn bản. Được chỉ định và ghi thông tin vào bảng điều khiển (hoặc trình báo). Để sử dụng mã, trước tiên bạn phải đặt tệp văn bản trong cùng một thư mục với ứng dụng của mình hoặc tạo tệp riêng bằng trình chỉnh sửa văn bản như Notepad hoặc Vi.

Dưới đây là một cái nhìn chi tiết về lệnh gọi tới fread (). Mã nguồn là từ một dự án ứng dụng bảng điều khiển Windows được tạo trong Microsoft Visual Studio và có thể yêu cầu điều chỉnh nhỏ để hoạt động trong trình biên dịch C của bạn – đặc biệt là khai báo hàm main (). Do đó bạn nên biết rằng trình biên dịch được thiết lập để sử dụng ANSI C89 và các biến cục bộ phải được khai báo khi bắt đầu các hàm.

/ *
 *
 * Đọc từ các tệp trong C bằng Fread
 *
* /
#bao gồm
int main (int argc, const char * argv []) {
    TẬP TIN * rm;
    char buf [201];
    printf ("\ r \ nUdemy.com - Đọc từ tệp trong C \ r \ n");
    rm = fopen ("ReadMe.txt", "r");
    if (rm! = NULL) {
        fread (buf, 1, 200, rm);
        buf [(sizeof buf) -1] = 0;
        printf ("% s", buf);
        fclose (rm);
    }
    khác
        printf ("Không tìm thấy tệp. \ r \ n");
}

fread () có định nghĩa hàm cụ thể như sau:

size_t fread (void * ptr, size_t size, size_t nmemb, FILE * stream);

Đối số đầu tiên mà nó chấp nhận là một con trỏ đến một vùng bộ nhớ sẽ chứa dữ liệu được đọc từ tệp. Đối  với ví dụ này mã sẽ chỉ định một mảng ký tự (buf) làm đích.

Đối số sẽ xác định kích thước của một phần tử đang được đọc. Kiểu dữ liệu char là một byte đơn, do đó giá trị được sử dụng ở đây sẽ là 1.

Nmemb chỉ định có bao nhiêu phần tử (kích thước cũng được chỉ định) để đọc từ tệp. Giá trị tối đa 200 ký tự từ tệp.

Cuối cùng, các đối số luồng chỉ định luồng tệp nào sẽ đọc từ đó – thường là con trỏ được trả về từ lệnh gọi fopen ().

Lưu ý khi đọc từ các tệp trong C bằng Fread

  • Giá trị trả về của fopen () được kiểm tra so với null để đảm bảo rằng tệp đã được mở thành công
  • Mã này không kiểm tra xem cuộc gọi đến fread () có thành công hay không và liệu nó có trả về số ký tự được yêu cầu hay không?
  • Phần tử cuối cùng trong mảng đệm được đặt thành 0 để đảm bảo rằng chuỗi được kết thúc bằng null, trước khi gửi kết quả đến bảng điều khiển bằng lệnh printf () 

Nếu tệp chứa ít byte hơn so với số được yêu cầu, thì lệnh gọi đến fread () sẽ đọc nhiều giá trị nhất có thể và trả về giá trị size_t, còn cho biết có bao nhiêu giá trị đã được đọc. Ví dụ dưới đây xác định một mảng đệm gồm 2000 ký tự, sau đó hiển thị bao nhiêu ký tự đã được đọc từ luồng tệp.

/ *
 *
 * Đọc từ các tệp trong C bằng Fread
 *
* /
#bao gồm
int main (int argc, const char * argv []) {
    TẬP TIN * rm;
    char buf [2000];
    int res;
    printf ("\ r \ nUdemy.com - Đọc từ tệp trong C \ r \ n");
    rm = fopen ("ReadMe.txt", "r");
    if (rm! = NULL) {
        res = fread (buf, 1, 2000, rm);
        printf ("Đọc% u byte. \ r \ n", res);
        fclose (rm);
    }
    khác
        printf ("Không tìm thấy tệp. \ r \ n");
}

Cách đọc từ các tệp trong C bằng Fread

cach-doc-tu-cac-tep-trong-c-bang-fread.jpg

Cách đọc từ các tệp trong C bằng Fread

Đọc toàn bộ tệp

Đối với các tệp nhỏ, ví dụ như khi cài đặt cấu hình hoặc tài nguyên từ tệp bên ngoài, nó sẽ giúp ích khi đọc toàn bộ tệp trong một lần. Để làm điều này, đầu tiên bạn phải tính kích thước của tệp theo byte. Điều này thường liên quan đến các hàm thư viện – chẳng hạn như fstat (), fseek () và ftell () hoặc sử dụng các quy trình xử lý tệp dành riêng cho hệ điều hành cho nền tảng mục tiêu của bạn. Cách tiếp cận sẽ giống nhau khi bạn lựa chọn kích thước phù hợp:

  • Tính toán kích thước của tệp cần đọc
  • Sử dụng malloc () để cấp phát một vùng bộ nhớ đủ lớn để chứa dữ liệu
  • Gọi fread (), chỉ định con trỏ trả về bởi malloc () là đích và kích thước của tệp là đối số nmemb 
  • Nên nhớ đóng tệp và giải phóng bộ nhớ được cấp phát bởi malloc () khi bạn đã hoàn tất quá trình làm việc với dữ liệu

Đối với nhiều ứng dụng, tốt hơn là lặp lại và đọc một số lượng byte nhỏ hơn cho đến khi đi đến cuối tệp. Bạn có thể lặp lại cho đến khi giá trị trả về của fread () nhỏ hơn số byte được yêu cầu hoặc sử dụng hàm feof () để phát hiện phần cuối của tệp.

rm = fopen ("ReadMe.txt", "r");
if (rm! = NULL) {
    trong khi (! feof (rm)) {
        res = fread (buf, 1, (sizeof buf) -1, rm);
        buf [res] = 0;
        printf ("% s", buf);
    }
    fclose (rm);
}

Đọc cấu trúc từ tệp

Tất cả các ví dụ trước ở trên đều dựa trên ý tưởng đọc byte từ một luồng tệp. Và lưu trữ kết quả trong một mảng hoặc các khối bộ nhớ khác nhau. Trong ngôn ngữ C, tất cả các kiểu dữ liệu được tạo thành. Từ ít nhất một byte (với nhiều kiểu khác sẽ bao gồm nhiều byte theo một thứ tự đã đặt). Tuy nhiên, bộ nhớ được sử dụng bởi tất cả các loại này. Có thể được truy cập từng byte một và nghĩa là có thể đọc bất kỳ loại giá trị nào từ tệp. Miễn là nó đã được lưu một cách chính xác.

Để tiếp tục với các ví dụ bên dưới, bạn hãy tạo tệp văn bản mới bằng Notepad hoặc Vi. Chỉ nhập bốn ký tự – ABCD – không có khoảng trắng và không có ngắt dòng. Sau đó, lưu tệp dưới dạng “Test.txt” trong thư mục. Nơi trình biên dịch đặt tệp thực thi đã biên dịch của bạn. Đoạn mã dưới đây dùng để đọc một đoạn ngắn (số nguyên 16 bit). Từ tệp văn bản bằng cách chỉ định kích thước phần tử (2). Và sử dụng địa chỉ của một biến ngắn làm con trỏ đích.

Trên Windows, giá trị đầu ra thường là 16,961. Do đó, nếu hai ký tự đầu tiên trong tệp văn bản là A (0x41) và B (0x42). Hai byte được đọc từ tệp sẽ ghi đè lên 2 byte trong bộ nhớ được short sử dụng. Tạo cho res giá trị mới là 0x4241.

Việc ghi đè vùng bộ nhớ được sử dụng. Bởi một kiểu dữ liệu không giới hạn ở các biến đơn. Mẫu mã cuối cùng này đọc 4 ký tự giống nhau từ tệp văn bản. Và ghi đè bộ nhớ được sử dụng bởi một cấu trúc. Dựa theo cách này thì toàn bộ cấu trúc. Có thể được tải từ các tệp bên ngoài với rất ít mã.

/ *
 *
 * Udemy.com
 * Đọc từ các tệp trong C bằng Fread
 *
* /
#bao gồm
#pragma pack (1)
struct TEST {
    char đầu tiên;
    giây ngắn ngủi;
    char thứ ba;
} myTest;
#pragma pack ()
int main (int argc, const char * argv []) {
    TẬP TIN * tf;
    printf ("\ r \ nUdemy.com - Đọc từ tệp trong C \ r \ n");
    tf = fopen ("Test.txt", "r");
    fread (& myTest, 1, 4, tf);
    fclose (tf);
    printf ("Đầu tiên:% c \ r \ n", myTest.first);
    printf ("Thứ hai:% u \ r \ n", myTest.second);
    printf ("Thứ ba:% c \ r \ n", myTest.third);
}

Khi các trình biên dịch C tạo cấu trúc. Các bạn có thể đệm chúng vào một kích thước thuận tiện cho quá trình làm việc. Để đọc thành công cấu trúc kiểm tra từ tệp văn bản. Bạn có thể sử dụng một sơ đồ đóng gói khác. Trong trường hợp này, sử dụng gói chỉ thị pragma (1). Để yêu cầu trình biên dịch không chèn thêm cấu trúc.

Quá trình thiết lập chế độ đóng gói của một cấu trúc. Có thể khác nhau giữa các trình biên dịch C.

Xử lý tệp nhiều hơn với C

Mặc dù fread () là một trong những hàm phổ biến nhất được sử dụng để đọc từ tệp. Trên thực tế trong quá trình sử dụng sẽ có hàm được dùng nhiều. Dùng ít tùy thuộc sự phù hợp và nhu cầu của bạn.

Tổng kết

Đọc từ các tệp trong C bằng Fread ngày càng trở nên phổ biến. Và được áp dụng rộng rãi trong quá trình tìm hiểu về ngôn ngữ C. Nhờ vào Fread mà mọi người có thể dễ dàng đọc. Và thao tác với các tệp, hàm dữ liệu một cách đơn giản.

5/5 - (5 bình chọn)
Xin chào các bạn! Mình là Hà Nguyên Phương Hiện đang là tác giả của Box.edu.vn website nổi tiếng chuyên review, đánh giá, giới thiệu các khóa học hay nhất hiện nay.