Góp ý về bài tập C về file IO và Dynamic memory allocation

Bài tập của em là đọc lại nội dung của 1 text file và in ra màn hình kết quả của 1 query. File này có N dòng và mỗi dòng có form: <Họ tên> <tuổi> <cân nặng(kg)>.
VD: Nguyen Van Minh 35 65.87
Query được đưa vào bởi user và có dạng:
./find <khoảng tuổi> < khoảng cân nặng> sắp xếp theo <tuổi/cân nặng> <tăng/giảm > dần
VD: ./find 35 40 60.3 70.8 sắp xếp theo tuổi tăng dần
Vậy là mình phải tìm những người có tuổi trong khoảng [35, 40] và cân nặng trong khoảng [60.3, 70.8] và in ra theo thứ tự tuổi tăng dần.
Nếu user nhập sai form của query thì phải in ra thông báo lỗi.

Em đã thử đọc và in ra toàn bộ file nhưng không biết làm thế nào để đưa vào khoảng tuổi, cân nặng và sắp xếp nội dung.

Đây là bài em đã viết:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    const int STEPSIZE = 100;

    char ** loadfile(char *filename, int *len);
    int main(int argc, char *argv[])
    {
        if(argc == 1)
        {
            printf("Must supply a filename to read\n");
            exit(1);
        }
        // Load file into data structure
        int length = 0;
        char **words = loadfile(argv[1], &length);

        //Display the first 100 lines
        printf("%d\n", length);

        for(int i = 0; i < length; i++)
        {
            printf("%s\n", words[i]);
        }
        printf("Done\n" );
    }

    char ** loadfile(char *filename, int *len)
    {
        FILE *f = fopen(filename, "r");
        if (!f)
        {
        printf("Cannot open %s for reading\n", filename);
        return NULL;
        }

        int arrlen = STEPSIZE;

        //Allocate space for 100 char*
        char **lines = (char **)malloc(arrlen * sizeof(char *));

        char buf[1000];
        int i = 0;
        while(fgets(buf, 1000, f))
        {
            //Check if array is full, If so, extend it
            if(i == arrlen)
            {
            arrlen += STEPSIZE;

            char ** newlines = realloc(lines, arrlen * sizeof(char *));
            if(!newlines)
            {
                printf("Cannot realloc\n");
                exit(1);
            }
            lines = newlines;
            }
        //Trim off newline char
        buf[strlen(buf) - 1] = '\0';

        //Get length of buf
        int slen = strlen(buf);

        //Allocate space for the string
        char *str = (char *)malloc((slen + 1) * sizeof(char));

        //Copy string from buf to str
        strcpy(str, buf);

        //Attach str to data structure
        lines[i] = str;

        i++;
        }
        *len = i; //  Set the length of the array of char *
        return lines;
    }

Em cần góp ý để đưa vào khoảng tuổi, cân nặng và cách sắp xếp. Và phiền mọi người góp ý về đọạn code ở trên của em. Em cảm ơn.

Hi Sơn Tùng.
Bạn đọc hết file vào mảng cấu trúc rồi thao tác trên đó.

1 Like

Trong trường hợp này thì àm thế nào để đọc file vào mảng cấu trúc nhỉ?

Ví dụ bạn có thể tạo 1 struct để chứa thông tin về một user:

typedef struct UserInfo
{
    char name[30];
    int age;
    float weight;
}User;

sau đó tạo 1 mảng struct , mảng này sẽ chứa data đọc ra từ file :

User* buffer = NULL;

Cái hàm loadFile() có thể sửa thành :

User* loadFile( char *filename, int *len );

Từ đó trong hàm main có thể gọi như sau :

buffer =  loadFile( ... );
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?