JavaScript is required

f là con trỏ trỏ đến tệp nhị phân DATA chứa không quá 100 bản ghi( kiểu cấu trúc) liền nhau. Cho khai báo. Đoạn chương trình nào sau đây đọc toàn bộ các bảng ghi trong DATA vào x: struct T { …}; struct T x[100] int i = 0, n = 0;

A.

fread(x+i++, sizeof(T), 1, f ); while (!feof(f)) fread(x+i++, sizeof(T), 1, f); fclose(f);

B.

fseek(f,0,SEEK_END); n=ftell(f)/sizeof(T); fseek(f,0,SEEK_SET); fread(x, sizeof(T), n, f); fclose(f);

C.

A và B đúng

D.

A và B sai

Trả lời:

Đáp án đúng: C


Phân tích từng đáp án: * **Đáp án A:** * `fread(x+i++, sizeof(T), 1, f );` Đọc một bản ghi từ tệp `f` và lưu vào `x[i]`, sau đó tăng `i`. Tuy nhiên, vòng lặp `while (!feof(f))` tiếp tục đọc cho đến khi gặp cuối tệp, và `feof(f)` chỉ trả về true *sau khi* một thao tác đọc thất bại do gặp cuối tệp. Điều này có nghĩa là sau khi đọc bản ghi cuối cùng, vòng lặp sẽ cố gắng đọc thêm một lần nữa, dẫn đến việc đọc lặp lại hoặc ghi đè lên dữ liệu. * **Đáp án B:** * `fseek(f,0,SEEK_END);` Di chuyển con trỏ tệp đến cuối tệp. * `n=ftell(f)/sizeof(T);` Tính số lượng bản ghi trong tệp bằng cách lấy vị trí hiện tại (cuối tệp) chia cho kích thước của một bản ghi. * `fseek(f,0,SEEK_SET);` Di chuyển con trỏ tệp trở lại đầu tệp. * `fread(x, sizeof(T), n, f);` Đọc `n` bản ghi từ tệp `f` và lưu vào mảng `x`. Cách này đúng vì xác định được số bản ghi để đọc. * `fclose(f);` Đóng tệp. Như vậy, đáp án B đúng, đáp án A sai. => D là đáp án đúng

Câu hỏi liên quan