Skip to content

信息学实验室作业(四)

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

一、实验目的

本次实验聚焦于文本文件处理与异常处理机制的结合运用。旨在通过C++编程实现从包含人员姓名和电话号码的文本文件中筛选出符合特定条件(电话号码包含不超过指定数量的不同数字)的信息,并写入新文件。同时,熟练掌握在文件操作中利用异常处理机制处理可能出现的错误,提升程序的稳定性和健壮性。

二、实验内容

手动生成一个文本文件,记录人员姓名和电话号码。编写程序创建第二个文件,将电话号码包含不超过指定数量不同数字的人员姓名和电话号码写入其中。在文件创建、读取和写入过程中,运用C++的异常处理机制,对可能出现的错误进行处理。

txt
孙三 1333333333
钱七 1567890123
赵六 1888866666
吴八 1300000000
郑九 1472583690
陈五 1555555555
王强 1398765432
李十 1666666666
周伟 1234567891
刘四 1777777777

三、实现思路

  1. 数据读取:使用std::ifstream打开手动生成的源文件。在try块中进行文件打开操作,若文件无法打开,通过throw抛出自定义异常,在catch块中捕获并处理该异常,输出错误信息。逐行读取文件内容,利用std::stringstream将每行数据拆分为姓名和电话号码。
  2. 数据筛选:定义函数判断电话号码中不同数字的数量,遍历电话号码中的每个字符,将其插入到std::set集合中(std::set会自动去重),通过std::set的大小获取不同数字的数量,与指定数量进行比较。
  3. 数据写入:使用std::ofstream打开目标文件用于写入筛选后的数据。同样在try块中进行文件打开操作,若打开失败抛出异常并在catch块中处理。将筛选出的姓名和电话号码按行写入目标文件。
  4. 异常处理:自定义异常类,继承自std::exception,用于处理文件操作和数据处理过程中的异常情况。在文件操作和数据筛选的关键步骤中,通过try-catch结构捕获异常,根据不同异常类型进行相应处理,如输出错误信息并结束程序,确保程序在遇到问题时能够合理响应。

四、代码实现

cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <set>
#include <string>

// 自定义异常类
class FileOperationException : public std::exception {
public:
    const char* what() const noexcept override {
        return "文件操作出现异常";
    }
};

class DataProcessingException : public std::exception {
public:
    const char* what() const noexcept override {
        return "数据处理出现异常";
    }
};

// 判断电话号码中不同数字的数量是否不超过指定数量
bool checkPhoneNumber(const std::string& phoneNumber, int maxDistinctDigits) {
    std::set<char> digits;
    for (char digit : phoneNumber) {
        if (isdigit(digit)) {
            digits.insert(digit);
        }
    }
    return digits.size() <= maxDistinctDigits;
}

// 筛选并写入数据
void filterAndWriteData(const std::string& inputFileName, const std::string& outputFileName, int maxDistinctDigits) {
    std::ifstream inputFile(inputFileName);
    if (!inputFile) {
        throw FileOperationException();
    }

    std::ofstream outputFile(outputFileName);
    if (!outputFile) {
        throw FileOperationException();
    }

    std::string line;
    while (std::getline(inputFile, line)) {
        std::stringstream ss(line);
        std::string name, phoneNumber;
        if (ss >> name >> phoneNumber) {
            try {
                if (checkPhoneNumber(phoneNumber, maxDistinctDigits)) {
                    outputFile << name << " " << phoneNumber << std::endl;
                }
            } catch (...) {
                throw DataProcessingException();
            }
        }
    }

    inputFile.close();
    outputFile.close();
}

int main() {
    const std::string inputFileName = "input.txt";
    const std::string outputFileName = "output.txt";
    const int maxDistinctDigits = 5;

    try {
        filterAndWriteData(inputFileName, outputFileName, maxDistinctDigits);
        std::cout << "数据筛选和写入完成" << std::endl;
    } catch (const FileOperationException& e) {
        std::cerr << e.what() << std::endl;
    } catch (const DataProcessingException& e) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

五、代码解释

  1. 自定义异常类FileOperationExceptionDataProcessingException继承自std::exception,分别用于处理文件操作和数据处理过程中出现的异常。what函数返回异常信息。
  2. checkPhoneNumber函数:接收电话号码和指定的最大不同数字数量作为参数。通过遍历电话号码中的字符,将数字字符插入std::set集合,利用std::set的去重特性,最后比较集合大小与指定数量,判断电话号码是否符合条件。
  3. filterAndWriteData函数:负责读取源文件、筛选数据并写入目标文件。在函数内部,首先尝试打开输入文件和输出文件,若打开失败抛出FileOperationException异常。逐行读取输入文件内容,使用std::stringstream将每行数据拆分为姓名和电话号码,调用checkPhoneNumber函数进行筛选,将符合条件的数据写入输出文件。在数据筛选过程中,若出现异常,抛出DataProcessingException异常。最后关闭输入文件和输出文件。
  4. main函数:定义输入文件名、输出文件名和最大不同数字数量。在try块中调用filterAndWriteData函数进行数据处理。若捕获到FileOperationExceptionDataProcessingException异常,在catch块中输出相应的异常信息。

六、编译与运行

  1. 准备输入文件:手动创建input.txt文件,每行格式为“姓名 电话号码”,例如:
张三 13812345678
李四 13998765432
王五 15611112222
  1. 编译代码:将上述代码保存为.cpp文件,如phone_filter.cpp。在命令行中使用g++编译器进行编译,命令为g++ phone_filter.cpp -o phone_filter
  2. 运行程序:编译成功后,在命令行中运行生成的可执行文件,命令为./phone_filter。运行后,程序会读取input.txt文件中的数据,筛选出电话号码包含不超过5个不同数字的人员信息,并将其写入output.txt文件。

七、实验总结

通过本次实验,成功掌握了在C++中结合文本文件处理和异常处理机制的编程技巧。在实验过程中,深入理解了异常处理机制对于提高程序稳定性和健壮性的重要性。遇到了文件路径错误、数据格式不匹配等问题,通过完善异常处理机制,能够更友好地提示错误信息,避免程序异常终止。未来可以进一步优化代码,如增加对输入文件格式的严格校验,提高程序的通用性和容错性。同时,在其他编程项目中,也会更注重异常处理,确保程序在各种情况下都能稳定运行。