30/09/2018, 16:12

Thao tác với file trong lập trình C

Mọi người cho mình hỏi một số vấn đề này với (mình đã tìm trên mạng và không/chưa tìm thấy)

  1. Làm sao để di chuyển con trỏ đọc file đến vị trí mình muốn (ví dụ như đến dòng thứ n, tại vi trí xuất hiện ký tự ‘|’ đầu tiên/thứ2/thứ3)
  2. Làm sao để update thông tin trên file ngay tại con trỏ file đang trỏ tới? Cụ thể hơn là nếu file có n dòng, mỗi dòng chứa các nội dung: tên, ngày sinh, địa chỉ. Làm sao để sửa tên 1 người nào đó? (thao tác xóa, sửa từng phần nội dung file)
    Cảm ơn m.n rất nhiều! ^^
Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

1.Làm sao để di chuyển con trỏ đọc file

Em sử dụng fseek

đến vị trí mình muốn (ví dụ như đến dòng thứ n

C không hỗ trợ cái này, em phải tự tìm postion đó bằng cách duyệt file cho tới khi nào gặp \n, tức là đến dòng mới.

Đây là ví dụ anh tìm thấy để đếm dòng

/* fseek example */
#include <stdio.h>

int main ()
{
    FILE *file;
    int c, line;

    file = fopen("example.txt", "rt");
    line = 0; /* 1 if you want to call the first line number 1 */
    while ((c = fgetc(file)) != EOF)
    {
        if (c == '\n')
            ++line;
        /*
            ... do stuff ...
        */
    }
}

tại vi trí xuất hiện ký tự ‘|’ đầu tiên/thứ2/thứ3)

Tương tự với tìm dòng.

Chia buồn với em là phải tự làm thôi.

  1. Làm sao để update thông tin trên file ngay tại con trỏ file đang trỏ tới? Cụ thể hơn là nếu file có n dòng, mỗi dòng chứa các nội dung: tên, ngày sinh, địa chỉ. Làm sao để sửa tên 1 người nào đó? (thao tác xóa, sửa từng phần nội dung file)

Có vẻ như em đang tìm cách update thông tin của một danh sách, anh nghĩ em dùng cách lưu file nhị phân thì hay hơn.

Như thế em sẽ giải quyết được vấn đề 1, em không cần quan tâm đến việc đang ở dòng nào và cần di chuyển tới dòng nào.

Em nói cụ thể structure của em bao gồm những thuộc tính nào, anh sẽ đưa ra giải pháp cụ thể.

Lãnh Huyết viết 18:20 ngày 30/09/2018

thank anh @ltt,
chương trình của em là chương trình học từ vựng tiếng anh, và struct của em bao gồm 2 thuộc tính là new_word và description thôi.
Khi người dùng cần nhập thêm từ mới thì mình cần sắp xếp theo alphabet để hiển thị khi cần.
Ngoài ra nếu từ đã trùng thì có lựa chọn update. Nếu dùng array rồi load toàn bộ nội dung file ra để sắp xếp hay update thì rất mất công và chương trình tốn nhiều bộ nhớ, vậy nên em muốn hỏi thêm về các thao tác xử lý trực tiếp trên file ^^
(Và 1 số chức năng test những từ đã học nữa)

Nguyễn Minh Dũng viết 18:12 ngày 30/09/2018

Nếu là như vậy thì anh nghĩ em nên lưu ở dạng nhị phân. Cho 2 thuộc tính này có tổng số byte bằng 256 hoặc 512 hoặc 1024, hoặc là bội số của 2 để tăng tốc độ đọc ghi file, nhưng cũng có thể không cần thiết lắm vì bây giờ tốc độ đọc ghi khá là nhanh rồi.

Nếu em muốn truy vấn một phần tử nào thì em chỉ cần nhảy tới i*1024 là tới được.

chương trình học từ vựng tiếng anh

Tuy nhiên nếu em làm từ điển thì anh nghĩ em nên quan tâm đến hash table. Tức là bảng băm để tăng tốc độ tìm kiếm.

Lãnh Huyết viết 18:25 ngày 30/09/2018

Không phải từ điển anh ạ. Chỉ là chương trình học từ vựng theo phương pháp review thôi (assignment của em)

Lãnh Huyết viết 18:21 ngày 30/09/2018

Lưu file ở dạng nhi phân là như nào anh nói cụ thể hơn một chút được không ạ?
Em chưa hiểu ý anh lắm ^^

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Lưu file ở dạng nhị phân là lúc mở file mình chọn “mode” là b. Em lưu dữ liệu có cấu trúc thì chọn cái này cho nó nhanh, nhẹ, chuẩn

/* fopen example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("myfile.txt","wb");
  if (pFile!=NULL)
  {
    fputs ("DayNhauHoc.Com 123",pFile);
    fclose (pFile);
  }
  return 0;
}
Bài liên quan
0