0965303260
TP. Hồ Chí Minh

[C]. Bài Tập Đọc Ghi File Text

Bài tập xử lý file trong bài viết này sẽ giúp các bạn rèn luyện kỹ năng đọc ghi file được tốt hơn, các bài tập được lồng ghép với những chú ý bạn cần lưu ý khi đọc ghi file.

NỘI DUNG : 

  • Chuẩn hóa tên
  • Cấp email sinh viên
  • Sắp xếp danh sách sinh viên theo gpa
  • Xếp loại học sinh
  • Đọc toàn bộ file số nguyên

bài tập đọc ghi file

1. Chuẩn hóa tên

Cho file tập tin sinhvien.txt chứa danh sách các tên sinh viên của trường đại học X, hãy chuẩn hóa và loại bỏ các dấu cách thừa giữa tên sinh viên và lưu vào file sinhvien_out.txt

File sinhvien.txt có khuôn mẫu như sau : Dòng đầu là số lượng sinh viên, các dòng sau là tên sinh viên mỗi sinh viên trên 1 dòng

Để làm được bài này bạn cần biết chuẩn hóa tên người, bạn có thể tham khảo tại đây

sinhvien.txtsinhvien_out.txt

4

nguyen    HoaNG   aNH

NguyEN  thi   THuy LInh

PhAM ngOC    nam

LuoNG Thi VAn

4

Nguyen Hoang Anh

Nguyen Thi Thuy Linh

Pham Ngoc Nam

Luong Thi Van


Code : 

#include "stdio.h"
#include "string.h"
#include "ctype.h"

//Hàm này chuẩn hóa từng từ : liNH => Linh
char* chuanHoaTu(char *s){
    s[0] = toupper(s[0]);
    for(int i = 1; i < strlen(s); i++){
        s[i] = tolower(s[i]);
    }
    return s;
}

char *chuanHoaTen(char *s, char *res){
    char *token = strtok(s, " ");
    while(token != NULL){
        //nối từ vào chuỗi kết quả res
        strcat(res, chuanHoaTu(token));
        token = strtok(NULL, " ");
        //Nếu chưa phải từ cuối thì nối thêm dấu cách
        if(token != NULL){
            strcat(res, " ");
        }
    }
    return res;
}

int main(){
    //Mo file
    FILE *in;
    in = fopen("sinhvien.txt", "r");
    if(in == NULL){
        printf("File not found !\n");
    }
    else{
        FILE *out;
        out = fopen("sinhvien_out.txt", "w");
        int n;
        fscanf(in, "%d", &n);
        fprintf(out, "%d\n", n);
        fgetc(in);
        char name[100], s[100];
        for(int i = 0; i < n; i++){
            //Doc file
            fgets(s, 100, in);
            s[strlen(s) - 1] = '\0';
            //Ghi file
            fprintf(out, "%s\n", chuanHoaTen(s, name));
            //reset xau name
            strcpy(name, "");
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}


2. Cấp email sinh viên

Cho danh sách sinh viên trong file sinhvien.txt, hãy cấp email sinh viên theo mẫu : Nguyen Van Nam => namnv@28tech.com.vn

Lưu lại danh sách email vào file email.txt

File sinhvien.txt gồm nhiều dòng mỗi dòng là tên 1 sinh viên có thể không chuẩn

sinhvien.txtemail.txt

nguyen HoaNG aNH

NguyEN thi THuy LInh

PhAM ngOC  nam

LuoNG Thi VAn

anhnh@28tech.com.vn

linhntt@28tech.com.vn

nampn@28tech.com.vn

vanlt@28tech.com.vn

Để làm được bài này bạn cần biết cú pháp đọc hết mọi dòng trong file input và biết cách cấp email từ tên, bạn có thể tham khảo tại đây nếu chưa biết cách cấp email từ tên theo mẫu trên 

Code : 

#include "stdio.h"
#include "string.h"
#include "ctype.h"

char *chuanHoa(char *name, char *email){
    char a[100][50];
    int n = 0;
    for(int i = 0; i < strlen(name); i++){
        name[i] = tolower(name[i]);
    }
    char *token = strtok(name, " ");
    while(token != NULL){
        strcpy(a[n], token); ++n;
        token = strtok(NULL, " ");
    }
    strcpy(email, a[n - 1]);
    int len = strlen(email);
    for(int i = 0; i < n - 1; i++){
        email[len] = a[i][0];
        ++len;
    }
    email[len] = '\0';
    strcat(email, "@28tech.com.vn");
    return email;
}

int main(){
    //Mo file
    FILE *in;
    in = fopen("sinhvien.txt", "r");
    if(in == NULL){
        printf("File not found !\n");
    }
    else{
        FILE *out;
        out = fopen("email.txt", "w");
        char name[100], email[100];
        //Đọc mọi dòng trong file
        while(fgets(name, 100, in) != NULL){
            name[strlen(name) - 1] = '\0';
            fprintf(out, "%s\n", chuanHoa(name, email));
            strcpy(email, "");
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}


3. Sắp xếp danh sách sinh viên theo gpa

Cho danh sách sinh viên trong file sinhvien.txt, mỗi sinh viên gồm tên, lớp, ngày sinh và điểm gpa. Thông tin mỗi sinh viên được ghi trên 1 dòng, các thông tin cách nhau 1 dấu ','

Thực hiện sắp xếp lại danh sách sinh viên này và ghi vào file sinhvien_out.txt với điểm gpa giảm dần

sinhvien.txtsinhvien_out.txt

Nguyen Van 28Tech,CNTT1,22/12/2004,3.5

Hoang Van Long,DTVT1,01/10/2003,3.8

Pham Van Nam,CNTT2,10/07/2004,2.5

Pham Thuy Linh,CNTT1,05/05/2003,3.1

Hoang Van Long,DTVT1,01/10/2003,3.8

Nguyen Van 28Tech,CNTT1,22/12/2004,3.5

Pham Thuy Linh,CNTT1,05/05/2003,3.1

Pham Van Nam,CNTT2,10/07/2004,2.5

Để giải quyết bài toán này bạn cần đọc từng dòng để lấy thông tin sau đó tách thông tin ra và lưu vào struct, sắp xếp mảng struct và cuối cùng ghi vào file output

Code : 

#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"

struct SinhVien{
    char ten[100];
    char lop[20];
    char ngaysinh[50];
    double gpa;
};

typedef struct SinhVien SinhVien;

int cmp(const void *a, const void *b){
    SinhVien *x = (SinhVien*)a;
    SinhVien *y = (SinhVien*)b;
    if(x->gpa > y->gpa)
        return -1;
    return 1;
}

int main(){
    FILE *in;
    SinhVien a[1000]; int n = 0;
    in = fopen("sinhvien.txt", "r");
    if(in == NULL){
        printf("File not found !\n");
    }
    else{
        FILE *out;
        out = fopen("sinhvien_out.txt", "w");
        char data[200], email[100];
        //Đọc mọi dòng trong file
        while(fgets(data, 200, in) != NULL){
            data[strlen(data) - 1] = '\0';
            //tach thong tin
            int stt = 0;
            char *token = strtok(data, ",");
            while(token != NULL){
                ++stt; // stt = 1 : ten, 2 : lop, 3 : ngaysinh, 4 : gpa
                if(stt == 1){
                    strcpy(a[n].ten, token);
                }
                else if(stt == 2){
                    strcpy(a[n].lop, token);
                }
                else if(stt == 3){
                    strcpy(a[n].ngaysinh, token);
                }
                else{
                    a[n].gpa = atof(token);
                }
                token = strtok(NULL, ",");
            }
            ++n; // tang so luong sinh vien
        }
        //Sap xep danh sach
        qsort(a, n, sizeof(SinhVien), cmp);
        //Ghi file
        for(int i = 0; i < n; i++){
            fprintf(out, "%s,%s,%s,%.1lf\n", a[i].ten, a[i].lop, a[i].ngaysinh, a[i].gpa);
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}


4. Xếp loại học sinh

Cho file hocsinh.txt chứa thông tin của các học sinh bao gồm có thông tin : tên và điểm 3 môn toán, lý, hóa

Hãy tính điểm trung bình và lưu vào file hocsinh_out.txt thông tin về điểm trung bình và xếp loại học lực.

  • Điểm trung bình ≥ 9.0 xếp loại Xuất sắc
  • Điểm trung bình ≥ 8.0 xếp loại giỏi
  • Điểm trung bình ≥ 6.5 xếp loại khá
  • Điểm trung bình ≥ 5 xếp loại trung bình
  • Điểm trung bình < 5 xếp loại yếu

File hocsinh.txt có khuôn mẫu như sau : File gồm nhiều dòng mỗi sinh viên gồm 2 dòng thông tin, dòng 1 là họ tên và dòng 2 là điểm toán lý hóa

File hocsinh_out.txt ghi thông tin tên, điểm trung bình và học lực trên từng dòng.

hocsinh.txthocsinh_out.txt

Nguyen Van 28Tech

6 7 8

Hoang Van Long

9 9 9

Nguyen Ngoc Phu

7 8 9

Nguyen Van 28Tech 7.0 KHA

Hoang Van Long 9.0 XUAT SAC

Nguyen Ngoc Phu 8.0 GIOI

Code : 

#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"

int main(){
    FILE *in;
    in = fopen("hocsinh.txt", "r");
    if(in == NULL){
        printf("File not found !\n");
    }
    else{
        FILE *out;
        out = fopen("hocsinh_out.txt", "w");
        char name[200], diem[100];
        //Đọc mọi dòng trong file
        while(fgets(name, 200, in) != NULL){
            name[strlen(name) - 1] = '\0';
            double t, l, h;
            fscanf(in, "%lf %lf %lf", &t, &l, &h);
            fgetc(in);
            double tb = (t + l + h) / 3;
            fprintf(out, "%s %.1lf ", name, tb);
            if(tb >= 9) fprintf(out, "XUAT SAC\n");
            else if(tb >= 8) fprintf(out, "GIOI\n");
            else if(tb >= 6.5) fprintf(out, "KHA\n");
            else if(tb >= 5) fprintf(out, "TRUNG BINH\n");
            else fprintf(out, "YEU");
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}


5. Đọc toàn bộ file số nguyên

Cho file number.txt chứa không quá 100000 số nguyên gồm nhiều dòng, mỗi dòng gồm nhiều số. Thực hiện đọc các số trong file này và ghi vào file prime.txt các số nguyên tố trong file theo thứ tự xuất hiện trong file, mỗi dòng không quá 10 số

number.txtprime.txt

2 3 8 9 

2 1 2 2 9 9 3 3 1

10 100 2 9 3 9234

123 123911 13

181 11 17 71 13 89 11

2 2 2 3 3 3 5 55 7 9 13

2 3 2 2 2 3 3 2 3 123911

13 181 11 17 71 13 89 11 2 2

2 3 3 3 5 7 13 

Code : 

#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "math.h"

int nt(int n){
    if(n < 2) return 0;
    for(int i = 2; i <= sqrt(n); i++){
        if(n % i == 0) return 0;
    }
    return 1;
}

int main(){
    FILE *in;
    in = fopen("number.txt", "r");
    if(in == NULL){
        printf("File not found !\n");
    }
    else{
        FILE *out;
        out = fopen("prime.txt", "w");
        int n, dem = 0;
        while(fscanf(in, "%d", &n) != -1){
            if(nt(n)){
                ++dem;
                fprintf(out, "%d ", n);
            }
            if(dem % 10 == 0)
                fprintf(out, "\n");
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}