// 编写一个C++ 程序，读取一个文件的内容并打印到控制台。 在文件读取过程中处理以下异常情况： 1）如果文件打开失败，则抛出一个自定义的异常对象 FileOpenException。 2）如果文件读取过程中发生错误，则抛出一个自定义的异常对象 FileReadException。
// 【要求】在 main 函数中调用文件读取函数，并捕获并处理可能抛出的异常。

#include <bits/stdc++.h>

using namespace std;

// 自定义异常类
class FileOpenException : public exception
{
public:
    const char *what() const throw()
    {
        return "文件打开异常";
    }
};

class FileReadException : public exception
{
public:
    const char *what() const throw()
    {
        return "文件读取异常";
    }
};

int main()
{
    FILE *fp = fopen("test.txt", "r");

    try
    {
        if (fp == NULL)
        {
            throw FileOpenException(); // 抛出自定义文件打开异常
        }
    }
    catch (exception &e)
    {
        cout << "捕获异常: " << e.what() << endl;
    }

    char ch;
    try
    {
        // EOF 表示到达文件结尾
        if (fscanf(fp, "%c", &ch) == EOF)
            throw FileReadException(); // 抛出自定义文件读取异常
    }
    catch (exception &e)
    {
        cout << "捕获异常: " << e.what() << endl;
    }

    fclose(fp);

    return 0;
}
