面试题答案
一键面试实现思路
- 写入文件:
- 打开文件用于写入。
- 遍历
Employee
结构体数组,对于每个结构体,先将id
、name
和salary
按格式写入文件。 - 对于
hire_date
,将其格式化为YYYY - MM - DD
的字符串,然后写入文件。 - 关闭文件。
- 读取文件:
- 打开文件用于读取。
- 逐行读取文件内容,每行对应一个
Employee
结构体。 - 从每行中解析出
id
、name
和salary
。 - 解析日期字符串并填充到
hire_date
结构体中。 - 将解析后的结构体添加到数组中。
- 关闭文件。
核心代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
struct Employee {
char id[10];
char name[30];
double salary;
struct tm hire_date;
};
// 将Employee结构体数组写入文件
void writeEmployeesToFile(const struct Employee *employees, int numEmployees, const char *filename) {
FILE *file = fopen(filename, "w");
if (file == NULL) {
perror("无法打开文件");
return;
}
char dateStr[20];
for (int i = 0; i < numEmployees; i++) {
strftime(dateStr, sizeof(dateStr), "%Y - %m - %d", &employees[i].hire_date);
fprintf(file, "%s %s %.2f %s\n", employees[i].id, employees[i].name, employees[i].salary, dateStr);
}
fclose(file);
}
// 从文件读取Employee结构体数组
struct Employee* readEmployeesFromFile(int *numEmployees, const char *filename) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
perror("无法打开文件");
*numEmployees = 0;
return NULL;
}
struct Employee *employees = NULL;
int capacity = 0;
char line[100];
*numEmployees = 0;
while (fgets(line, sizeof(line), file) != NULL) {
if (*numEmployees >= capacity) {
capacity = capacity == 0? 1 : capacity * 2;
employees = realloc(employees, capacity * sizeof(struct Employee));
}
sscanf(line, "%9s %29s %lf %19s", employees[*numEmployees].id, employees[*numEmployees].name, &employees[*numEmployees].salary, line);
struct tm tm = {0};
strptime(line, "%Y - %m - %d", &tm);
employees[*numEmployees].hire_date = tm;
(*numEmployees)++;
}
fclose(file);
if (employees != NULL) {
employees = realloc(employees, *numEmployees * sizeof(struct Employee));
}
return employees;
}
你可以这样使用这些函数:
int main() {
struct Employee employees[] = {
{"001", "Alice", 5000.0, {0, 0, 0, 1, 1, 119, 0, 0, 0}},
{"002", "Bob", 6000.0, {0, 0, 0, 2, 2, 119, 0, 0, 0}}
};
int numEmployees = sizeof(employees) / sizeof(employees[0]);
writeEmployeesToFile(employees, numEmployees, "employees.txt");
int newNumEmployees;
struct Employee *newEmployees = readEmployeesFromFile(&newNumEmployees, "employees.txt");
for (int i = 0; i < newNumEmployees; i++) {
char dateStr[20];
strftime(dateStr, sizeof(dateStr), "%Y - %m - %d", &newEmployees[i].hire_date);
printf("%s %s %.2f %s\n", newEmployees[i].id, newEmployees[i].name, newEmployees[i].salary, dateStr);
}
free(newEmployees);
return 0;
}