MST

星途 面试题库

面试题:C语言结构体与文件操作的高级应用

假设存在一个文本文件,每行记录了一本书的信息,包括书名、作者、出版年份,各信息以逗号分隔。定义合适的结构体来存储这些信息。编写C程序将文件中的书籍信息读取到结构体数组中,对数组按出版年份进行降序排序,然后将排序后的信息以格式化的方式写入到另一个文本文件中,要求使用合适的文件操作函数并合理处理内存管理问题。
38.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体存储书籍信息
typedef struct {
    char title[100];
    char author[50];
    int year;
} Book;

// 比较函数,用于qsort按出版年份降序排序
int compare(const void *a, const void *b) {
    return ((Book *)b)->year - ((Book *)a)->year;
}

int main() {
    FILE *inputFile, *outputFile;
    Book *books = NULL;
    int capacity = 0, count = 0;
    char line[200];

    // 打开输入文件
    inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        perror("无法打开输入文件");
        return 1;
    }

    // 动态分配内存以存储书籍信息
    while (fgets(line, sizeof(line), inputFile) != NULL) {
        if (count >= capacity) {
            capacity = capacity == 0? 1 : capacity * 2;
            books = realloc(books, capacity * sizeof(Book));
        }
        sscanf(line, "%[^,],%[^,],%d", books[count].title, books[count].author, &books[count].year);
        count++;
    }
    fclose(inputFile);

    // 对书籍信息按出版年份降序排序
    qsort(books, count, sizeof(Book), compare);

    // 打开输出文件
    outputFile = fopen("output.txt", "w");
    if (outputFile == NULL) {
        perror("无法打开输出文件");
        free(books);
        return 1;
    }

    // 将排序后的书籍信息写入输出文件
    for (int i = 0; i < count; i++) {
        fprintf(outputFile, "书名: %s, 作者: %s, 出版年份: %d\n", books[i].title, books[i].author, books[i].year);
    }
    fclose(outputFile);

    // 释放内存
    free(books);

    return 0;
}
  1. 结构体定义:定义了一个Book结构体,用于存储书名、作者和出版年份。
  2. 动态内存分配:使用realloc函数动态分配内存,以适应文件中书籍数量的变化。
  3. 文件读取:使用fgets逐行读取文件内容,并通过sscanf解析每行数据到结构体数组。
  4. 排序:使用qsort函数按出版年份对结构体数组进行降序排序。
  5. 文件写入:将排序后的书籍信息以格式化的方式写入到另一个文件中。
  6. 内存管理:在程序结束前释放动态分配的内存,避免内存泄漏。