Đọc dữ liệu từ file binary vào array structure

Hiện tại code em có làm như sau

void saveAllCoursesData(Course ** c, int size)
{
    FILE *cfPtr;
  
    if((cfPtr = fopen("courses.dat", "wb")) == NULL)
    {
        puts("File could not be opened");
    }
    else
    {
        
        for(int i = 0; i < size ; i++)
        {
            fwrite(&c[i], sizeof(Course), 1, cfPtr);
        }
        
  
        fclose(cfPtr);
    }
}
void loadAllCoursesData(Course ** c)
{
    FILE *cfPtr;
  
    if((cfPtr = fopen("courses.dat", "rb")) == NULL)
    {
        puts("File could not be opened");
    }
    else
    {
        for(int i = 0; ...... ; i++)
        {
            fread(&c[i], sizeof(Course), 1, cfPtr);
        }
    }
    
    fclose(cfPtr);
}

Em đang muốn hỏi về điều kiện ở loadAllCourseData vì hình như mình không thể dùng foef() được.
Không biết em đang gặp lỗi ở đâu anh chị có thể chỉ em p.p sửa không
Em cảm ơn

Đầu tiên là hãy loại bỏ thói quen copy & paste khi code, cái này sẽ giúp bạn suốt cả quãng đời lập trình của bạn đó.
Hai là, hãy tập dùng debugger khi code không chạy đúng như những gì bạn nghĩ, lúc đó bạn sẽ thấy được đúng những gì bạn viết.
Ba là, bạn đọc nội dung file bằng fwrite à?

3 Likes

Code này mình tự viết bạn ơi

Mình copy lên nhầm code, nhưng chủ yếu là mình muốn hỏi về việc xét điều kiện cho binary file khi không dùng feof() đoạn mình còn trống. Tại vì mình không thể dùng i < sizeof© / sizeof(c[0]) được

Một là, mình không đề cập copy từ chỗ khác, mà là copy từ đoạn trên đem xuống đoạn dưới.
Hai là, đã sửa code dùng hàm fread thì bạn có bao giờ thừ đọc hướng dẫn sử dụng của fread chưa?
Trích:

Return value

Number of objects read successfully, which may be less than count if an error or end-of-file condition occurs.

If size or count is zero, fread returns zero and performs no other action.

fread does not distinguish between end-of-file and error, and callers must use feof and ferror to determine which occurred.

4 Likes

Trong link anh gửi em, như em đọc thì

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

số này sẽ được trả về bằng số nmemb nếu fread thực hiện được, tức là ở đây sẽ là 1 phần tử.
Nên em có thể áp dụng điều kiện

size_t check = 1;
for(int i = 0; check == 1; i++)
{
     check = fread(&c[i], sizeof(Course), 1, cfPtr);
}

Ủa sao không dùng while nhỉ?

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?