Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [C]Help về xóa dữ liệu trong tệp

  1. #1
    No Avatar
    SongTuDo Khách

    Mặc định [C]Help về xóa dữ liệu trong tệp

    Mình tìm hoài trong C mà ko thấy các hàm xóa dữ liệu trong tệp đâu cả , ví dụ lưu 40 học sinh gồm có điểm , lớp , tên trong 1 file , muốn xóa thông tin về 1 học sinh trong số đó thì làm thế nào . Ko cần code cụ thể cũng được , chỉ cho tớ phương pháp với , mà có code thì càng hay . Thanks trước

  2. #2
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bạn coi cả tệp đó là 1 mảng và mỗi phần tử trong mảng là một cấu trúc. Ở đây cấu trúc học sinh bao gồm có : lớp, điểm, tên. Khi bạn mở tệp và đọc thì bạn đọc từng phần tử một. Rồi xét chi tiết, hay truy cập sâu hơn ở các phần tử đó, để lấy thông tin mà mình cần so sánh và xác định xóa hay không. Những thông tin bạn lấy được bạn có thể phân loại ra và ghi lại ở các tệp tạm, từ các tệp tạm này bạn bố cục hợp lý để lọc ra thông tin cần xóa.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  3. #3
    No Avatar
    SongTuDo Khách

    Cám ơn bạn , cho tớ hỏi muốn xóa mảng hay dữ liệu ta làm cách nào ? . hic tớ ko biết

  4. #4
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Vì ta coi cả file đó là 1 mảng thì muốn xóa một mảng thì cứ delete cái file đó đi là xong xài

    Còn muốn xóa chi tiết từng phần tử tổng file thì lại khác. Khi cậu mở 1 file ra thì cậu phải gán cho nó 1 vùng bộ nhớ lưu trữ tạm, thì lúc này cậu làm việc trên vùng bộ nhớ đó để phân loại ra phần tử cậu cần xóa và không. Sau đó cậu sẽ ghi lại file theo cách nào đó (cái này là tùy cậu )...
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Thao tác với tệp chỉ có thể ghi thêm vào không thể xóa bớt đi. Vì thế có hai giải pháp:
    Giải pháp 1: Tạo thêm cho mỗi bản ghi một trường gọi là xoa , khi duyệt các bản ghi ta chỉ đọc những bản nào có xóa bằng 0 ( nghĩa là chưa xóa). Cách làm này nhanh, thậm chí nếu muốn có thể đưa thêm password và nữa, tuy nhiên do các bản ghi cần đọc không liên tiếp nhau nên thao tác sẽ phức tạp ví dụ để tìm tổng số bản ghi ta phải duyệt từ đầu hoặc có cơ chế lưu trữ thích hợp chứ không thể dựa vào kích thước file nữa.
    Giải pháp 2: Khi muốn xóa một bản ghi đi ta viết lại toàn bộ file dữ liệu sang file mới và không có chứa bản ghi đó. Cách này mất thời gian khi gặp các file lớn nhưng đảm bảo tính đơn giản khi giải quyết.

  6. #6
    No Avatar
    SongTuDo Khách

    Mặc định [C]Help về xóa dữ liệu trong tệp

    Cám ơn các bác , giải pháp 1 của bác halloc12 thì hình như dữ liệu kia chỉ ko đọc ra chứ vẫn còn trong file , việc này sẽ làm tăng dung lượng file ko đáng có thì phải , em sẽ thử giải pháp 2 của bác , cám ơn các bác 1 lần nữa .
    Hic đang làm case study mà tắc chỗ này , mượn case của mấy đàn anh khóa trước thi toàn thứ cao siêu quá chẳng hiểu nổi , thôi đành tự làm , đến đâu thì đến vậy .

  7. #7
    No Avatar
    tuananh2006hp Khách

    Tôi có giải pháp như thế này mọi người thấy thế nào:
    Ban đầu ta mở file với chế đọc.Sao chép toàn bộ dữ liệu sang một cấu trúc(nếu dữ liệu là mọt cấu trúc).Sau đó ta tạo một file để ghi có tên đúng như thế.Kiểm tra điều kiện xóa.Nếu nó dữ liệu không trùng với điều kiên xóa ta thực hiện việc ghi lại dữ liệu vào file.Sau đây là một ví dụ.Lưu ý file ban đầu phải có sẵn.Bạn có thể xem code sau để chỉnh sửa cho bài tập của mình:
    void xoatheomasach(struct sach thongtinsach[maxhs])
    {
    int i;
    int masachcanxoa;
    int n;
    FILE *fp;
    clrscr();
    printf("\n\n\tNhap vao ma so sach:");
    scanf("%d",&masachcanxoa);
    // mo file che do doc.
    fp = fopen("C:\\temp\\abc1.txt","r+");
    if(fp==NULL)
    {
    printf("Mo file bi loi!");
    return ;
    }
    //doc het
    i=0;
    fflush(stdin);
    while(!feof(fp))
    {

    fgets(thongtinsach[i].tensach,100,fp);
    fscanf(fp,"%d",&thongtinsach[i].masosach);
    fgets(thongtinsach[i].loaisach,100,fp);
    fgets(thongtinsach[i].noidungsach,100,fp);
    fscanf(fp,"%d",&thongtinsach[i].soluongsach);
    i++;
    }

    n=i;
    fclose(fp);
    fp = fopen("C:\\temp\\abc1.txt","w");
    for(i=0;i<n;i++)
    {
    if(masachcanxoa!=thongtinsach[i].masosach)
    {
    fprintf(fp,"%s\n",thongtinsach[i].tensach);
    fflush(stdin);
    fprintf(fp,"%d\n",thongtinsach[i].masosach);
    fflush(stdin);
    fprintf(fp,"%s\n",thongtinsach[i].loaisach);
    fflush(stdin);
    fprintf(fp,"%s\n",thongtinsach[i].noidungsach);
    fflush(stdin);
    fprintf(fp,"%d\n",thongtinsach[i].soluongsach);
    }
    }
    fclose(fp);
    printf("Da xoa!!!");

    printf("\n\nAn phim bat ky de tro ve menu!");
    getch();
    clrscr();
    fflush(stdin);
    return;
    }

  8. #8
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Tớ thấy cơ chế của Hải Lộc tốt nhất, thích hợp code phải triển rộng hơn --> Pro
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  9. #9
    Ngày gia nhập
    12 2008
    Bài viết
    0

    Chào Các Pac. Em cũng đang làm quản lý về sinh viên bằng file.
    Em làm hết tất cả " thêm, sữa, tìm kiếm, xóa" .nhưng em làm tác động trực tiếp đến file không đọc dữ liệu ra bộ nhớ vào mảng hay cấu trúc. vì em nghỉ giả sử mình có hơn 1000 sinh viên thì sau: mỗi lần xóa phải đọc hết tất cả 1000 sinh viên đó lên rồi thao tác xong lại ghi vào file thì phải nói là khó khăn, làm chương trình rất nặng. em làm đc mấy phần kia trực tiếp trên file.
    nhưng còn có hàm xóa một sinh viên trực tiếp trên file thì không dc.
    em có ý định là:
    giã sử mình có n sinh viên, muốn xóa sinh viên thứ i thì em thay thế thằng i+1 cho thằng i và cứ thế cho đến cuối file. nhưng khi kiểm tra lại thì ngặt một nỗi là cuối file có 2 phần tử trùng nhau vì vòng lặp chạy tới cuối thì sinh viên(n-1)= sinh vien (n) nên xuất hiện (n-1) và (n) trùng nhau. lúc đầu có n sinh viên, nhưng khi xóa thì phải còn n-1 thôi.
    làm sao mình xóa bỏ dc thằng thứ n dc ah.
    mong các pác giúp em với. em sắp nộp rồi

Các đề tài tương tự

  1. Không thể xóa file trong IsolatedStorageFile, cách nào để xóa?
    Gửi bởi mrdungx trong diễn đàn Lập trình Windows Mobile bằng C#
    Trả lời: 0
    Bài viết cuối: 04-04-2013, 11:25 PM
  2. ADO.NET Xóa dữ liệu trong gridview nhưng không được xóa trong database như thế nào ?
    Gửi bởi phuocxao21 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 26-11-2012, 10:41 AM
  3. Kỹ thuật C++0x Xóa không được 1 phần tử bất kì và xóa tại vị trí bất kì trong DSLK
    Gửi bởi datinh_o0o7 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 19-03-2011, 10:24 PM
  4. Bài tập C++ xóa sinh viên trong dssv , ai test dùm em , xóa sv thứ 3 mà nó toàn xóa sv thứ 4
    Gửi bởi prt_awm trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 08-11-2010, 02:24 PM
  5. Tại sao chọn xóa n lại xóa tại n + 1 - Linked List trong lập trình C
    Gửi bởi dieucay555 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 03-03-2008, 11:43 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn