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