1. Giới thiệu
Trong quá trình phát triển dự án, thường có nhu cầu lưu trữ hoặc đọc các cấu hình cụ thể từ tệp tin, và các dữ liệu này thường được tổ chức theo một định dạng xác định trước. Hệ điều hành Linux cung cấp hai hàm hữu ích giúp thao tác đọc/ghi nội dung với định dạng cố định một cách thuận tiện: fprintf và fscanf.
2. Ứng dụng cơ bản
2.1 Hàm fprintf
Hàm này cho phép ghi nội dung với định dạng xác định vào tệp tin thông qua một bộ mô tả tệp đã mở. Xem ví dụ dưới đây để hiểu rõ cách sử dụng:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <iostream>
#include <string>
int main() {
FILE* fp = fopen("./config.txt", "w+");
if (fp == NULL) {
std::cout << "Không thể mở tệp..." << std::endl;
} else {
// Ghi dữ liệu
fprintf(fp, "username: john_doe\n");
fprintf(fp, "gender: male\n");
fprintf(fp, "years: 25\n");
}
// Đóng tệp
if (fp != NULL) {
fclose(fp);
fp = NULL;
}
return 0;
}
Sau khi chạy chương trình, tệp config.txt sẽ chứa dữ liệu theo định dạng đã chỉ định.
2.2 Hàm fscanf
Hàm này được dùng để đọc dữ liệu có định dạng từ tệp tin. Một điểm đặc biệt là nó có thể lưu trực tiếp nội dung đọc được vào các biến, nhưng yêu cầu kiểu dữ liệu của biến phải khớp với định dạng đọc. Ví dụ minh họa:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <iostream>
#include <string>
int main() {
char userName[32];
char userGender[16];
int userAge;
FILE* fp = fopen("./config.txt", "w+");
if (fp == NULL) {
std::cout << "Không thể mở tệp..." << std::endl;
} else {
// Ghi dữ liệu vào tệp
fprintf(fp, "username: john_doe\n");
fprintf(fp, "gender: male\n");
fprintf(fp, "years: 25\n");
// Di chuyển con trỏ tệp về đầu
fseek(fp, 0, SEEK_SET);
// Đọc dữ liệu và lưu vào biến
fscanf(fp, "username: %s\n", userName);
fscanf(fp, "gender: %s\n", userGender);
fscanf(fp, "years: %d\n", &userAge);
}
// In giá trị ra màn hình
std::cout << "Tên: " << userName << std::endl;
std::cout << "Giới tính: " << userGender << std::endl;
std::cout << "Tuổi: " << userAge << std::endl;
// Đóng tệp
if (fp != NULL) {
fclose(fp);
fp = NULL;
}
return 0;
}
Kết quả đầu ra sẽ hiển thị các giá trị đã đọc từ tệp và được lưu trong các biến tương ứng.