Skip to content

信息学实验室作业(二)

更新: 2025/3/15 字数: 0 字 时长: 0 分钟

一、实验目的

本次实验旨在运用C语言标准库<stdio.h>中的文件操作函数,实现对文本文件的创建、读取、写入以及数据筛选处理。通过完成具体任务,深入理解文件操作的原理和应用,提升编程实践能力。

二、实验内容 - 图书信息处理

(一)任务描述

  1. 生成一个文本文件,记录若干图书的信息,每本图书需包含作者、书名、出版年份。
  2. 从已生成的文件中筛选出书名包含“C++”且出版年份晚于指定年份的图书信息,并将这些信息写入到另一个文本文件中。

(二)实现思路

  1. 生成图书信息文件:利用fopen函数以写入模式打开一个新文件,通过循环将预先设定好的多本图书的作者、书名、出版年份信息,按照特定格式(各信息以逗号分隔,每行代表一本图书),使用fprintf函数写入文件。完成写入后,使用fclose函数关闭文件,确保数据正确保存。
  2. 筛选并写入符合条件的图书信息:首先用fopen函数以读取模式打开包含所有图书信息的文件,同时以写入模式打开用于存储筛选结果的新文件。在读取原文件过程中,借助fscanf函数按行读取每本图书的信息,将其存储到相应的变量中。接着,使用strstr函数判断书名中是否包含“C++”,并检查出版年份是否大于指定年份。若满足这两个条件,则使用fprintf函数将该图书信息写入新文件。全部读取和筛选完成后,关闭这两个文件。

(三)代码实现

c
#include <stdio.h>
#include <string.h>

#define MAX_BOOKS 100
#define MAX_LENGTH 100

// 图书结构体
typedef struct {
    char author[MAX_LENGTH];
    char title[MAX_LENGTH];
    int year;
} Book;

// 生成图书信息文件
void generateBookFile(const char *filename) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }

    // 示例图书信息
    Book books[MAX_BOOKS] = {
        {"Author1", "C++ Primer", 2020},
        {"Author2", "Python Crash Course", 2019},
        {"Author3", "Effective C++", 2022},
        {"Author4", "Data Science Handbook", 2021}
    };

    int numBooks = 4;

    for (int i = 0; i < numBooks; i++) {
        fprintf(file, "%s,%s,%d\n", books[i].author, books[i].title, books[i].year);
    }

    fclose(file);
}

// 筛选并写入符合条件的图书信息
void filterAndWriteBooks(const char *inputFilename, const char *outputFilename, int year) {
    FILE *inputFile = fopen(inputFilename, "r");
    if (inputFile == NULL) {
        perror("无法打开输入文件");
        return;
    }

    FILE *outputFile = fopen(outputFilename, "w");
    if (outputFile == NULL) {
        perror("无法打开输出文件");
        fclose(inputFile);
        return;
    }

    Book book;
    while (fscanf(inputFile, "%[^,],%[^,],%d\n", book.author, book.title, &book.year) == 3) {
        if (strstr(book.title, "C++") != NULL && book.year > year) {
            fprintf(outputFile, "%s,%s,%d\n", book.author, book.title, book.year);
        }
    }

    fclose(inputFile);
    fclose(outputFile);
}

int main() {
    const char *inputFilename = "books.txt";
    const char *outputFilename = "filtered_books.txt";
    int year = 2020;

    // 生成图书信息文件
    generateBookFile(inputFilename);

    // 筛选并写入符合条件的图书信息
    filterAndWriteBooks(inputFilename, outputFilename, year);

    printf("处理完成,筛选后的图书信息已写入 %s\n", outputFilename);

    return 0;
}

(四)代码解释

  1. 定义结构体Book结构体用于存储每本图书的作者、书名和出版年份信息,方便后续对图书数据的处理和传递。
  2. generateBookFile函数:该函数负责创建包含图书信息的文件。函数接收文件名作为参数,使用fopen打开文件。若打开失败,通过perror函数输出错误信息并返回。接着,在函数内部定义了一些示例图书信息,通过循环遍历这些信息,利用fprintf函数将每本图书的信息按特定格式写入文件。最后,使用fclose关闭文件,确保数据写入磁盘。
  3. filterAndWriteBooks函数:此函数实现筛选和写入符合条件图书信息的功能。它接收输入文件名、输出文件名和指定年份作为参数。首先尝试打开输入文件和输出文件,若打开失败则输出错误信息并关闭已打开的文件(若有)。在函数内部,定义了一个Book结构体变量用于存储读取到的图书信息。通过while循环和fscanf函数逐行读取输入文件中的图书信息,每次读取成功时,使用strstr函数检查书名中是否包含“C++”,同时判断出版年份是否大于指定年份。若满足条件,则使用fprintf函数将该图书信息写入输出文件。循环结束后,关闭输入文件和输出文件。
  4. main函数:在main函数中,定义了输入文件名、输出文件名和指定年份。先调用generateBookFile函数生成包含所有图书信息的文件,再调用filterAndWriteBooks函数进行图书信息的筛选和写入。最后,在控制台输出处理完成的提示信息,告知用户筛选后的图书信息已写入指定文件。

(五)编译与运行

  1. 将上述代码保存为一个.c文件,例如book_filter.c
  2. 在命令行中,使用gcc编译器对代码进行编译,命令为gcc book_filter.c -o book_filter。编译成功后会生成一个可执行文件book_filter
  3. 运行生成的可执行文件,命令为./book_filter。运行后,会在当前目录下生成两个文件:books.txt包含所有预先设定的图书信息;filtered_books.txt包含筛选后的符合条件的图书信息,即书名包含“C++”且出版年份晚于2020年的图书信息。

三、实验总结

通过本次实验,成功掌握了C语言中文件操作函数的基本使用方法,学会了如何创建文件、向文件中写入数据、从文件中读取数据以及根据特定条件对文件中的数据进行筛选和处理。在实验过程中,遇到了文件打开失败、数据格式处理等问题,通过仔细检查代码和查阅资料得以解决,这进一步加深了对文件操作原理的理解。同时,认识到在处理文件数据时,合理规划数据结构和算法的重要性,这有助于提高程序的效率和可读性。后续将继续深入学习文件操作相关知识,尝试处理更复杂的文件数据处理任务。