MST

星途 面试题库

面试题:C语言结构体文件I/O高级难度题

给定一个结构体struct Employee { char id[10]; char name[30]; double salary; struct tm hire_date; }; 要求实现将Employee结构体数组写入文本文件,且日期格式为'YYYY - MM - DD'。从文本文件读取时,要正确解析日期并重构结构体数组。请描述实现思路并编写核心代码。
37.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 写入文件
    • 打开文件用于写入。
    • 遍历Employee结构体数组,对于每个结构体,先将idnamesalary按格式写入文件。
    • 对于hire_date,将其格式化为YYYY - MM - DD的字符串,然后写入文件。
    • 关闭文件。
  2. 读取文件
    • 打开文件用于读取。
    • 逐行读取文件内容,每行对应一个Employee结构体。
    • 从每行中解析出idnamesalary
    • 解析日期字符串并填充到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;
}