Đọc Nội Dung File Theo Dòng Trong C

Đọc Nội Dung File Theo Dòng Trong C

Hàm getline()trong C được sử dụng để hỗ trợ việc lấy dữ liệu theo từng dòng của một file. Hàm getline() sẽ đọc nội dung của từng dòng trong file và gán vào buffer. Trong bài viết này chúng ta sẽ tìm hiểu cách đọc nội dung một fiel theo từng dòng sử dụng hàm getline().

Bạn có thể tham khảo đoạn code đầy đủ ở phía cuối của bài viết.

File Header

Trong file header của chương trình bạn thêm vào dòng code sau:

#include <stdlib.h>
#include <stdio.h>  
#define FILENAME "my_file.txt"

Ở trên chúng ta import vào thư viện stdlib và stdio và định nghĩa hằng số FILENAME. Giá trị của hằng số này sẽ là tên của tập tin mà chúng ta sẽ đọc nội dung từ đó.

Khởi Tạo Biến

Tiếp theo trong hàm main() bạn thêm đoạn code sau:

#define FILENAME "my_file.txt"

int main(void)
{
  char *line_buf = NULL;
  size_t line_buf_size = 0;
  int line_count = 0;
  ssize_t line_size;
  FILE *fp = fopen(FILENAME, "r");
  if (!fp)
  {
    fprintf(stderr, "Lỗi đọc file '%s'\n", FILENAME);
    return EXIT_FAILURE;
  }
}

Ở trên chúng ta khai báo các biến sau:

  • line_buf chứa dữ liệu buffer được trả về sau mỗi lần hàm getline() được gọi.
  • line_buf_size chứa dữ liệu size của buffer.
  • line_count chứa số lượng dòng trong file.
  • fp biến này là là một file pointer với giá trị trả về từ hàm fopen().

Đoạn code phía cuối kiểm tra giá trị của biến fp nếu giá trị trả về là false chúng ta sẽ hiển thị lỗi đọc file ra màn hình.

Đọc File

Tiếp theo vẫn ở trong hàm main(), phía sau câu lệnh if ở trên bạn thêm đoạn mã dưới đây:

  /* Đọc dòng đầu tiên trong file */
  line_size = getline(&line_buf, &line_buf_size, fp);

  /* Lặp lại việc đọc và hiển thị nội dung cho tới khi hoàn tất */
  while (line_size >= 0)
  {
    /* Tăng số lượng dòng 1 đơn vị */
    line_count++;

    /* Hiển thị: 1. thứ tự của dòng, 2. số lượng ký tự trong dòng, 3. dung lượng dữ liệu và 4.nội dung cùa dòng */
    printf("line[%06d]: chars=%06zd, buf size=%06zu, contents: %s", line_count, line_size, line_buf_size, line_buf);

    /* Đọc dòng tiếp theo */
    line_size = getline(&line_buf, &line_buf_size, fp);
  }

Đoạn mã trên thực hiện việc đọc trong file theo từng dòng một và sau đó hiển thị các dữ liệu liên quan tới nội dung của dòng đã được đọc.

Giải Phóng Memory và Đóng File Pointer

Sau khi kết thúc việc đọc nội dung file thì bước cuối cùng chúng ta cần làm đó là giải phóng bộ nhớ và đóng file pointer. Điều này là hết sức cần thiết vì sẽ giúp hạn chế việc chương trình chiếm dụng bộ nhớ. Trong hàm main() và phía sau dòng code cuối cùng vừa được thêm ở phần trước chúng ta thêm đoạn code sau:

  line_size = getline(&line_buf, &line_buf_size, fp);
  /* Giải phóng buffer */
  free(line_buf);
  line_buf = NULL;

  /* Đóng file pointer */
  fclose(fp);

  return EXIT_SUCCESS;
}

Tới đây bạn có thể compile chương trình trên sau đó tạo tập tin my_file.txt với nội dung mẫu và chạy chương trình để kiểm tra.

Và như đã đề cập ở trên dưới đây là đoạn code đầy đủ cho chương tình đọc nội dung tập tin theo dòng:

#include <stdlib.h>
#include <stdio.h>  
#define FILENAME "my_file.txt"

int main(void)
{
  char *line_buf = NULL;
  size_t line_buf_size = 0;
  int line_count = 0;
  ssize_t line_size;
  FILE *fp = fopen(FILENAME, "r");
  if (!fp)
  {
    fprintf(stderr, "Lỗi đọc file '%s'\n", FILENAME);
    return EXIT_FAILURE;
  }

  /* Đọc dòng đầu tiên trong file */
  line_size = getline(&line_buf, &line_buf_size, fp);

  /* Lặp lại việc đọc và hiển thị nội dung cho tới khi hoàn tất */
  while (line_size >= 0)
  {
    /* Tăng số lượng dòng 1 đơn vị */
    line_count++;

    /* Hiển thị: 1. thứ tự của dòng, 2. số lượng ký tự trong dòng, 3. dung lượng dữ liệu và 4.nội dung cùa dòng */
    printf("line[%06d]: chars=%06zd, buf size=%06zu, contents: %s", line_count, line_size, line_buf_size, line_buf);

    /* Đọc dòng tiếp theo */
    line_size = getline(&line_buf, &line_buf_size, fp);
  }
  /* Giải phóng buffer */
  free(line_buf);
  line_buf = NULL;

  /* Đóng file pointer */
  fclose(fp);

  return EXIT_SUCCESS;
}

    Guest

    - 1970/01/01 Trả lời

    ở trong bài có đoạn đề cập tới biến *fblà một file pointer trả về từ fopen, bác có thể giải thích kỹ hơn về file pointer trong C được không?

    Guest

    - 1970/01/01 Trả lời

    Bạn có thể tham khảo thêm về file pointer ở đây

    Guest

    - 1970/01/01 Trả lời

    sao mình chạy code thì nó bảo getline chưa được khai báo là sao v ạ

    Guest

    - 1970/01/01 Trả lời

    Upload screenshot lỗi lên nhé bạn

    Guest

    - 1970/01/01 Trả lời

    hàm getLine() chưa có sao gọi được anh ?

    Guest

    - 1970/01/01 Trả lời

    Trang nay , khong danh cho lop co ban, kho hieu qua

10 bình luận