首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为ifstream::failure和ofstream::failure异常引发错误C2312

为ifstream::failure和ofstream::failure异常引发错误C2312
EN

Stack Overflow用户
提问于 2022-09-22 14:25:33
回答 1查看 37关注 0票数 0

我正在编写一个修改文本文件的小应用程序。它首先创建文件的副本,以防出问题。

下面的函数在同一个目录中创建此副本。它以文件名作为参数,如果成功创建副本,则返回true;如果副本失败,则返回false。

代码语言:javascript
复制
#include <iostream>
#include <filesystem>
#include <fstream>
#include <string>

using std::ifstream;
using std::ofstream;
using std::string;
using std::cerr;
using std::cin;
using std::cout;
using std::endl;

bool backupFile(string FileName) {
    cout << "Creating backup for " << FileName << "..." << endl;

    try { // for debugging purposes
        string NewName = "bkp_" + FileName;
        string CurLine;
        ifstream FileCopy(FileName);
        ofstream FileBackup(NewName);

        if (FileCopy.fail()) { // Could specify how file copy failed?
            cerr << "Error opening file " << FileName << ".";
            return false;
        }
        
        while (getline(FileCopy, CurLine)) { // Copy lines to new file
            //cout << "Copying " << CurLine << "\" to " << NewName << "." << endl;
            FileBackup << CurLine << "\n";
        }     


        cout << "File successfully backed up to " << NewName << endl;
        return true;
    }
    catch (const ifstream::failure& iE) {
        cerr << "Exception thrown opening original file: " << iE.what() << endl;
        return false;
    }
    catch (const ofstream::failure& oE) {
        cerr << "Exception thrown outputting copy: " << oE.what() << endl;
    }
    catch (...) {
        cerr << "Unknown exception thrown copying file." << endl;
        return false;
    }
}

我使用了几个catch语句来指示输入(ifstream::failure)、输出(ofstream::failure)是否有问题,或者两者都没有。

然而,在编译过程中,会出现以下错误:

代码语言:javascript
复制
error C2312: 'const std::ios_base::failure &': is caught by 'const std::ios_base::failure &' on line 42

对我来说,错误意味着ifstream::failure和ofstream::failure都被ifstream::failure捕获,这似乎很奇怪。当我删除ofstream::failure的捕获时,它运行得很好。

为什么是这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-22 14:32:11

ifstream::failureofstream::failure都是在std::ios_base基类std::ios_base::failure中定义的相同类型,不能在两个单独的catch子句中捕获相同的类型。

请注意,您的流实际上都不会抛出任何异常,默认情况下std::fstream不会抛出任何异常。您必须通过调用exceptions打开异常

代码语言:javascript
复制
FileCopy.exceptions(f.failbit);
FileBackup.exceptions(f.failbit);

当流进入失败状态时,上述内容将导致引发std::ios_base::failure。由于您已经在检查FileCopy.fail(),所以您可以将该检查扩展到其他故障情况(例如,检查FileCopygetline期间没有失败,FileBackup也没有失败),而不是启用异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73816371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档