Chủ đề của PRF192 - Cơ sở lập trình

PRF192 - Phần 9: Tệp tin

Ứng với CLO9, buổi 52 đến 57 và là phần khép lại môn học. Nội dung bắt đầu từ lý do cần tệp tin: dữ liệu trong biến mất khi chương trình kết thúc, còn tệp giúp lưu trữ lâu dài. Phần phân loại so sánh tệp văn bản với tệp nhị phân về cách lưu trữ, khả năng đọc bằng mắt thường, kích thước và tốc độ. Phần thao tác trình bày con trỏ FILE, hàm mở tệp cùng các chế độ đọc, ghi và ghi thêm, thói quen bắt buộc là kiểm tra kết quả mở tệp trước khi dùng, và hàm đóng tệp để đẩy dữ liệu từ bộ đệm xuống đĩa. Phần cuối là hai cách truy cập tuần tự và ngẫu nhiên cùng bộ hàm tương ứng để đọc ghi theo định dạng, theo dòng, theo ký tự, theo khối, và các hàm dịch chuyển vị trí đọc ghi.

Xem danh sách câu hỏi20 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

20Câu hỏi hiện có

Câu hỏi của chủ đề

20/20 câuHết danh sách
Đề bài
FILE *fp;
fp = fopen("demo.txt", "rb");
AOpen "demo.txt" in binary mode for reading
BCreate a new file "demo.txt" for reading and writing
COpen "demo.txt" in binary mode for reading and writing
DNone of these
Lời giải
Đáp án đúng: "Open "demo.txt" in binary mode for reading". Chuỗi chế độ của fopen đọc theo từng chữ: r nghĩa là mở để đọc và đòi tệp phải tồn tại, nếu không có thì hàm trả về NULL; b nghĩa là chế độ nhị phân, hệ thống không chuyển đổi ký tự xuống dòng và không diễn giải nội dung, byte đọc ra đúng như byte trong tệp. Vì chuỗi không có dấu cộng nên không được phép ghi. "Create a new file "demo.txt" for reading and writing" là việc của chế độ w+, chế độ đó còn xoá trắng tệp cũ, trong khi r không tạo tệp mới. "Open "demo.txt" in binary mode for reading and writing" là chế độ r+b, phải có thêm dấu cộng mới được ghi. "None of these" sai vì cách đọc r cùng b đã khớp đúng một lựa chọn có sẵn.
Mở trang câu hỏi này →
A"w+" truncates existing files, "a+" preserves them.
B"a+" can only append data, while "w+" can only write from the beginning.
C"a+" opens binary files, while "w+" opens text files.
D"a+" allows reading only, while "w+" allows both reading and writing.
Lời giải
Đáp án đúng: "w+" truncates existing files, "a+" preserves them. Khác biệt gốc nằm ở lúc mở một tệp đã có: chế độ w+ cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, còn a+ giữ nguyên nội dung cũ và mọi phép ghi luôn được đẩy xuống cuối tệp bất kể con trỏ đọc đang ở đâu; cả hai đều tạo tệp mới nếu tệp chưa tồn tại và cả hai đều cho cả đọc lẫn ghi nhờ dấu cộng. Câu "a+" can only append data, while "w+" can only write from the beginning. sai vì dấu cộng ở cả hai chế độ đều mở thêm quyền đọc. Câu "a+" opens binary files, while "w+" opens text files. sai vì chế độ nhị phân do chữ b quyết định, hai chuỗi này đều là chế độ văn bản. Câu "a+" allows reading only, while "w+" allows both reading and writing. sai vì a+ cho ghi, chỉ khác là ghi luôn vào cuối tệp.
Mở trang câu hỏi này →
Afprintf
Bfwritef
Cfsendf
Dfputs
Lời giải
Đáp án đúng: "fprintf". Hàm fprintf dùng y như printf nhưng thêm tham số đầu là con trỏ tệp, nên nó nhận chuỗi định dạng cùng các đối số rồi ghi kết quả đã định dạng vào tệp thay vì ra màn hình; thực chất printf chỉ là fprintf gắn sẵn với dòng xuất chuẩn. "fwritef" không tồn tại trong thư viện chuẩn, người học thường nhầm nó với fwrite dùng cho dữ liệu nhị phân. "fsendf" cũng không có trong thư viện chuẩn C, gọi tới sẽ lỗi ở khâu liên kết. "fputs" có thật nhưng chỉ ghi một chuỗi đã có sẵn, nó không nhận chuỗi định dạng nên không chèn được giá trị số hay ký tự vào văn bản.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    FILE *file_ptr;
    file_ptr = fopen("output.txt", "w");
    if (file_ptr == NULL) {
        printf("Unable to open the file.\n");
        return 1;
    }
    fprintf(file_ptr, "Hello, World!\nThis is a test.");
    fclose(file_ptr);
    return 0;
}

Assuming the code is executed successfully, what will be the content of the "output.txt" file?

AHello, World! This is a test.
BHello, World! This is a test.
CHello, World!
DThis is a test.
Lời giải
Đáp án đúng: "Hello, World! This is a test." Chuỗi định dạng truyền cho fprintf chứa dãy thoát xuống dòng ở giữa, nên khi ghi ra tệp nó trở thành một ký tự xuống dòng thật, chia nội dung thành hai dòng; fprintf ghi đúng những gì chuỗi định dạng mô tả, không tự thêm hay bớt ký tự nào, và chế độ w tạo tệp mới hoặc xoá trắng tệp cũ trước khi ghi, còn fclose đẩy hết bộ đệm xuống đĩa nên nội dung chắc chắn được lưu đủ. "Hello, World! This is a test." sai vì nó thay ký tự xuống dòng bằng một khoảng trắng, chuyện đó không xảy ra. "Hello, World!" sai vì nó chỉ lấy phần trước dấu xuống dòng, trong khi một lần gọi fprintf ghi trọn chuỗi. "This is a test." sai vì nó bỏ phần đầu của chuỗi, mà không có lệnh nào ghi đè phần đó.
Mở trang câu hỏi này →
Afprintf()
Bfwrite()
Cfputc()
Dfprintb()
Lời giải
Đáp án đúng: "fwrite()". Hàm fwrite nhận địa chỉ vùng dữ liệu, kích thước một phần tử, số phần tử và con trỏ tệp, rồi sao nguyên từng byte trong bộ nhớ ra tệp, nên nó ghi được cả cấu trúc hay mảng số mà không đổi sang dạng chữ; hàm đi cặp với nó khi đọc lại là fread. "fprintf()" ghi văn bản đã định dạng, số 1000 sẽ thành bốn ký tự chữ số chứ không phải các byte nguyên của một int. "fputc()" chỉ ghi đúng một ký tự mỗi lần gọi, không mô tả được kích thước phần tử nên không phù hợp để đổ cả khối dữ liệu. "fprintb()" không tồn tại trong thư viện chuẩn C, gọi tới sẽ lỗi ở khâu liên kết.
Mở trang câu hỏi này →
ATo reset the file pointer to the beginning of the file.
BTo read the entire file into memory.
CTo close the file.
DTo move the file pointer to the end of the file.
Lời giải
Đáp án đúng: "To reset the file pointer to the beginning of the file." Hàm rewind đặt vị trí đọc ghi của dòng tệp về byte đầu tiên, đồng thời xoá cờ lỗi và cờ kết thúc tệp, nên sau khi đã đọc hết tệp vẫn có thể đọc lại từ đầu; nó tương đương fseek về mốc 0 kèm việc dọn cờ. "To read the entire file into memory." sai vì hàm không chuyển một byte nội dung nào, nó chỉ dịch con trỏ vị trí trong cấu trúc dòng tệp. "To close the file." sai vì đóng tệp là việc của fclose, sau rewind thì tệp vẫn đang mở và dùng tiếp được. "To move the file pointer to the end of the file." sai vì đó là việc của fseek với mốc cuối tệp, ngược hẳn chiều với rewind.
Mở trang câu hỏi này →
AChecking the return value of fopen()
BUsing ferror()
CUsing feof()
DUsing fprintf()
Lời giải
Đáp án đúng: "Checking the return value of fopen()". Trong C, fopen là chỗ duy nhất cho biết việc mở tệp có thành công hay không: thành công thì nó trả về một con trỏ FILE hợp lệ, thất bại thì trả về NULL, chẳng hạn khi đường dẫn sai hoặc tiến trình không có quyền ghi. Vì mọi hàm làm việc với tệp về sau đều cần con trỏ ấy, bắt buộc phải so nó với NULL ngay sau khi gọi, trước khi đem ra dùng. Ý "Using ferror()" sai vì ferror chỉ tra cờ lỗi của một dòng tệp đã mở được, muốn gọi nó thì trong tay phải có sẵn con trỏ FILE hợp lệ, nghĩa là việc mở đã thành công rồi. Ý "Using feof()" sai vì feof cho biết đã đọc tới cuối tệp, chuyện đó không liên quan gì tới việc mở tệp để ghi. Ý "Using fprintf()" sai vì fprintf là hàm ghi dữ liệu; nếu con trỏ truyền vào là NULL thì chương trình rơi vào hành vi không xác định chứ không nhận được thông báo lỗi nào.
Mở trang câu hỏi này →
Afgets()
Bfputs()
Cftell()
Dfopen()
Lời giải
Đáp án đúng: "fgets()". Hàm này đọc từ một dòng tệp cho tới khi gặp ký tự xuống dòng hoặc khi đã lấy đủ số ký tự mà ta giới hạn, rồi tự thêm ký tự kết thúc chuỗi vào cuối vùng đệm. Chỗ giới hạn kích thước chính là lý do fgets được dùng thay cho gets, vì nó không cho dữ liệu vào tràn khỏi mảng đích. Ý "fputs()" sai vì nó làm việc ngược lại, ghi một chuỗi ra tệp. Ý "ftell()" sai vì nó chỉ cho biết vị trí hiện tại của con trỏ đọc ghi trong tệp, không chuyển một byte dữ liệu nào. Ý "fopen()" sai vì nó chỉ mở tệp và trả về con trỏ FILE cho các hàm khác dùng; mở xong vẫn chưa có ký tự nào được đọc vào bộ nhớ.
Mở trang câu hỏi này →
Afseek()
Bfftell()
Crewind()
Dreturn()
Lời giải
Đáp án đúng: "rewind()". Mỗi dòng tệp đang mở có một chỉ báo vị trí cho biết lần đọc hoặc ghi tiếp theo bắt đầu từ đâu; lời gọi rewind đưa chỉ báo đó về byte đầu tệp và xoá luôn cờ báo hết tệp cùng cờ lỗi, nhờ vậy đọc lại được từ đầu mà không cần mở lại. Hàm "fseek()" cũng dịch được chỉ báo và về được đầu tệp nếu truyền độ dời 0 với mốc đầu tệp, nhưng nó là hàm định vị tổng quát cần ba đối số chứ không phải hàm chuyên đưa về đầu, và nó không xoá cờ lỗi. Tên "fftell()" viết sai chính tả của ftell, mà việc của ftell cũng chỉ là báo lại vị trí hiện thời dưới dạng một con số, hoàn toàn không dịch chuyển gì. Tên "return()" là từ khoá trả giá trị khỏi hàm, không liên quan tới tệp và cũng không phải hàm thư viện.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    char buffer[100];
    int number;

    if (fp != NULL) {
        fgets(buffer, sizeof(buffer), fp);
        fscanf(fp, "%d", &number);
        fclose(fp);
    }
    return 0;
}

What will be stored in the variables after execution?

Abuffer = "Hello World\n", number = 42
Bbuffer = "Hello World", number = 42
Cbuffer = "Hello", number = 0
Dbuffer = "Hello World\n", number = undefined
Lời giải
Đáp án đúng: "buffer = "Hello World\n", number = 42". Hàm fgets đọc tới hết dòng hoặc tới khi gần đầy vùng đệm, nó giữ lại ký tự xuống dòng rồi mới thêm ký tự kết thúc chuỗi; vùng đệm 100 byte đủ chứa dòng đầu nên buffer nhận trọn Hello World kèm ký tự xuống dòng. Chỉ báo vị trí tệp lúc này nằm ở đầu dòng thứ hai, nên fscanf với đặc tả %d bỏ qua khoảng trắng dẫn đầu, đọc hai chữ số và ghi 42 vào number. Mô tả "buffer = "Hello World", number = 42" bỏ mất ký tự xuống dòng, mà đó đúng là chỗ khác nhau giữa fgets và các hàm đọc dòng kiểu cũ. Mô tả "buffer = "Hello", number = 0" ứng với cách đọc theo từ của scanf với đặc tả chuỗi, còn fgets không dừng ở khoảng trắng. Mô tả "buffer = "Hello World\n", number = undefined" sai ở phần số: dòng thứ hai có số nguyên hợp lệ nên fscanf đọc được và báo đã gán một giá trị.
Mở trang câu hỏi này →
AFILE *f = fwrite("output.txt", "a" );
BFILE *f = fopen("output.txt", "a" );
CFILE *f = fopen("output.txt", "a+" );
DFILE *f = fopen("output.txt", "w+" );
EFILE *f = fopen("output.txt ", "w" );
Lời giải
Đáp án đúng gồm hai ý: "FILE *f = fopen("output.txt", "a" );" và "FILE *f = fopen("output.txt", "a+" );". Chế độ ghi nối giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, bất kể chỉ báo vị trí đang ở đâu; tệp chưa tồn tại thì thư viện tạo mới. Chế độ nối có thêm dấu cộng cũng ghi ở cuối, chỉ mở thêm quyền đọc, nên vẫn thoả yêu cầu. Lệnh "FILE *f = fwrite("output.txt", "a" );" sai hàm: fwrite không mở tệp mà ghi một khối dữ liệu, nó cần bốn đối số gồm con trỏ dữ liệu, kích thước phần tử, số phần tử và con trỏ tệp, lại trả về số phần tử đã ghi chứ không trả về con trỏ tệp. Lệnh "FILE *f = fopen("output.txt", "w+" );" cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, đó là ghi mới chứ không phải ghi thêm. Lệnh "FILE *f = fopen("output.txt ", "w" );" cũng cắt tệp, ngoài ra tên tệp còn thừa một dấu cách nên trỏ sang tên khác.
Mở trang câu hỏi này →
ACreate a file named employee.dat. The address of the newly created file is assigned to the file pointer fp.
BOpen a file named employee.dat to read data. If the file exists, the address of the file is assigned to the file pointer fp.
COpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
DOpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp and all existing data will be overwritten. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
Lời giải
Đáp án đúng: "Open a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.". Chế độ nối của fopen giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, còn tệp chưa có thì thư viện tạo mới; giá trị trả về là con trỏ tới cấu trúc mô tả dòng tệp, hoặc con trỏ rỗng khi mở thất bại. Mô tả "Create a file named employee.dat." nói như thể luôn tạo tệp mới, bỏ mất trường hợp tệp đã tồn tại và bỏ luôn ý nghĩa ghi nối. Mô tả "Open a file named employee.dat to read data." ứng với chế độ đọc, và chế độ đó còn trả về con trỏ rỗng khi tệp không tồn tại chứ không tạo tệp. Mô tả "all existing data will be overwritten" tự mâu thuẫn với việc nối thêm: xoá sạch nội dung cũ là hành vi của chế độ ghi mới.
Mở trang câu hỏi này →
Aopen()
Bfopen()
Cfileopen()
Dopenfile()
Lời giải
Đáp án đúng: "fopen()". Thư viện chuẩn mở tệp bằng fopen, khai báo trong stdio.h: nó nhận tên tệp cùng chế độ mở rồi trả về một con trỏ tệp để các hàm fscanf, fgets, fprintf, fclose dùng tiếp, hoặc trả về con trỏ rỗng nếu mở thất bại, nên luôn phải kiểm tra trước khi đọc ghi. Lựa chọn "open()" là lời gọi hệ thống của POSIX, nằm ngoài thư viện chuẩn và trả về một số hiệu tệp chứ không phải con trỏ tệp, nên không ghép được với họ hàm trong stdio.h. Lựa chọn "fileopen()" không tồn tại trong thư viện chuẩn. Lựa chọn "openfile()" cũng không tồn tại; cả hai chỉ là những cái tên nghe hợp lý được dựng ra để gây nhầm.
Mở trang câu hỏi này →
Afgets
Bfgetc
Cfputs
Dfpusc
Lời giải
Đáp án đúng: "fgets". Hàm fgets đọc từ dòng đã mở cho tới khi gặp ký tự xuống dòng, hết tệp hay đủ số ký tự tối đa, rồi đặt kết quả vào vùng đệm do người gọi đưa tới và tự thêm ký tự kết thúc chuỗi. Chính tham số giới hạn kích thước làm nó an toàn hơn gets, hàm đã bị loại khỏi chuẩn vì không chặn được tràn vùng đệm. Cũng lưu ý fgets giữ lại ký tự xuống dòng nếu vùng đệm còn đủ chỗ. Lựa chọn "fgetc" chỉ đọc đúng một ký tự mỗi lần gọi, muốn lấy cả dòng phải tự viết vòng lặp. Lựa chọn "fputs" đi theo chiều ngược lại, nó ghi một chuỗi ra dòng xuất. Lựa chọn "fpusc" không phải tên hàm nào của thư viện chuẩn, nó chỉ là biến dạng gõ sai của fputc.
Mở trang câu hỏi này →
A"r"
B"w+"
C"a+"
D"r+"
Lời giải
Đáp án đúng gồm hai ý: "w+" và "a+". Dấu cộng trong chế độ mở nghĩa là cho phép cả đọc lẫn ghi trên cùng một dòng; còn chữ đứng trước quyết định chuyện tệp có được tạo hay không. Chế độ ghi cắt sẽ tạo tệp mới nếu chưa có và xoá trắng nội dung nếu đã có; chế độ nối thêm cũng tạo tệp khi chưa có, giữ nguyên nội dung cũ và mọi lần ghi đều dồn về cuối tệp bất kể con trỏ tệp đang ở đâu. Cả hai vì vậy thoả đồng thời hai tiêu chí của câu hỏi. Lựa chọn "r" chỉ cho đọc và fopen trả về con trỏ rỗng nếu tệp không tồn tại, nên trượt cả hai tiêu chí. Lựa chọn "r+" cho cả đọc và ghi nhưng vẫn đòi tệp phải có sẵn, nó không tạo tệp mới, nên trượt đúng ở tiêu chí tạo tệp.
Mở trang câu hỏi này →
ABring the pointer fp back to the beginning of the file
BAssign to the pointer fp the address 0x00 (NULL)
CBring the pointer fp to the end of the file
DBring the pointer fp back to the beginning of the current line
Lời giải
Đáp án đúng: "Bring the pointer fp back to the beginning of the file". Mỗi tệp đang mở mang theo một vị trí đọc ghi hiện hành; rewind đặt vị trí đó về byte số không, đồng thời xoá cờ lỗi và cờ hết tệp, nên nó tương đương fseek về mốc đầu kèm clearerr và cho đọc lại tệp từ đầu mà không phải đóng rồi mở lại. Cách nói "Assign to the pointer fp the address 0x00 (NULL)" sai vì rewind không đụng tới giá trị của biến fp, fp vẫn trỏ vào cùng cấu trúc tệp; gán rỗng cho fp còn làm mọi lần dùng sau đó hỏng. Cách nói "Bring the pointer fp to the end of the file" là việc của fseek với mốc cuối, ngược hướng với rewind. Cách nói "Bring the pointer fp back to the beginning of the current line" không có trong C vì luồng tệp chỉ là dãy byte, thư viện chuẩn không ghi nhớ ranh giới dòng để lùi về đầu dòng.
Mở trang câu hỏi này →
AWriting formatted data to a file.
BReading formatted data from a file.
CAppending formatted data to a file.
DClosing a file.
Lời giải
Đáp án đúng: "Writing formatted data to a file." Hàm fprintf là bản mở rộng của printf: tham số đầu là con trỏ tệp chỉ luồng đích, phần sau vẫn là chuỗi định dạng và danh sách giá trị, nên nó biến các giá trị trong bộ nhớ thành văn bản rồi ghi vào luồng đó. Mô tả "Reading formatted data from a file." là việc của fscanf, hàm đi hướng ngược lại và cần địa chỉ biến để nạp vào. Mô tả "Appending formatted data to a file." nói về vị trí ghi chứ không phải về hàm: ghi nối vào cuối hay ghi từ đầu do chế độ mở trong fopen quyết định, cùng một fprintf sẽ nối thêm với chế độ mở nối và ghi đè với chế độ mở ghi. Mô tả "Closing a file." là việc của fclose, hàm đẩy nốt vùng đệm xuống đĩa rồi giải phóng cấu trúc tệp.
Mở trang câu hỏi này →
Afputs()
Bfscanf()
Cfgets()
Dfopen()
Lời giải
Đáp án đúng: "fputs()". Hàm này nhận một chuỗi kết thúc rỗng cùng con trỏ tệp, rồi ghi các ký tự của chuỗi vào luồng, bỏ lại byte kết thúc và không tự thêm dấu xuống dòng, nên nó là cách trực tiếp nhất để đưa một chuỗi ra tệp. Hàm "fscanf()" đi hướng ngược lại, đọc dữ liệu từ tệp theo chuỗi định dạng và cần địa chỉ biến để nạp vào, nên không ghi gì cả. Hàm "fgets()" cũng là hàm đọc, lấy một dòng từ tệp vào vùng đệm có giới hạn độ dài; cặp fgets và fputs dễ nhầm chính vì tên gần giống nhau mà hướng dữ liệu trái ngược. Hàm "fopen()" chỉ mở tệp và trả về con trỏ tệp cho các hàm khác dùng, bản thân nó không chuyển một byte nội dung nào.
Mở trang câu hỏi này →
Afopen("file.txt", "r")
Bopen("file.txt", "w")
Cfopen("file.txt", "w")
Dopen("file.txt", "r")
Lời giải
Đáp án đúng: "fopen("file.txt", "r")". Thư viện chuẩn mở tệp bằng fopen: hàm nhận tên tệp và chuỗi chế độ, trả về con trỏ tệp hoặc giá trị rỗng nếu thất bại; chế độ đọc mở tệp sẵn có, đặt vị trí ở đầu và không làm hỏng nội dung. Lệnh "fopen("file.txt", "w")" vẫn đúng hàm nhưng chế độ ghi cắt tệp về rỗng nếu tệp đã có, dùng để đọc là mất dữ liệu. Lệnh "open("file.txt", "r")" sai hàm: open là lời gọi hệ thống của POSIX, khai báo trong fcntl.h, nhận cờ dạng số chứ không nhận chuỗi chế độ, và trả về số hiệu tệp chứ không phải con trỏ tệp. Lệnh "open("file.txt", "w")" sai cả hai mặt, vừa dùng lời gọi hệ thống với chuỗi chế độ không hợp lệ, vừa nhắm ý ghi trong khi đề hỏi mở để đọc.
Mở trang câu hỏi này →
ARead data from the file.
BPrint to the screen.
CRead data from the keyboard.
DOpen a file.
EPrint to file.
Lời giải
Đáp án đúng: "Read data from the file." Hàm fscanf là bản mở rộng của scanf: tham số đầu là con trỏ tệp chỉ luồng nguồn, sau đó là chuỗi định dạng và danh sách địa chỉ biến; hàm đọc văn bản trong tệp, chuyển theo đặc tả rồi nạp vào các biến, và trả về số mục chuyển đổi thành công. Mô tả "Print to the screen." là việc của printf, in ra luồng ra chuẩn. Mô tả "Read data from the keyboard." là việc của scanf, tức fscanf với luồng stdin; bàn phím chỉ là một trường hợp riêng, còn fscanf nói chung đọc từ luồng được truyền vào. Mô tả "Open a file." là việc của fopen, hàm tạo ra con trỏ tệp mà fscanf cần. Mô tả "Print to file." là việc của fprintf, đi hướng ngược lại: lấy giá trị trong bộ nhớ, ghi thành văn bản vào tệp.
Mở trang câu hỏi này →

Đề có câu hỏi của chủ đề này

7 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.