我正在编写一个修改文本文件的小型应用程序。它首先创建文件的副本,以防出现问题。
以下函数在同一目录中创建此副本。它将文件名作为参数,如果成功创建副本,则返回true,如果失败,则返回false。
#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(是否存在问题,或者两者都不存在。
然而,在编译过程中,会出现以下错误:
error C2312: 'const std::ios_base::failure &': is caught by 'const std::ios_base::failure &' on line 42
对我来说,这个错误意味着ifstream::failure和ofstream::failure都被捕捉到了,这似乎很奇怪。当我移除对stream::failure的捕获时,它运行良好。
为什么会出现这种情况?
ifstream::failure
和ofstream::failure
都是在std::ios_base
基类std::ios_base::failure
中定义的同一类型,在两个单独的catch
子句中不能捕获同一类型。
请注意,两个流实际上都不会抛出任何异常,默认情况下std::fstream
不会抛出任何例外。您必须通过调用exceptions
:来打开异常
FileCopy.exceptions(f.failbit);
FileBackup.exceptions(f.failbit);
当流进入失败状态时,上述情况将导致抛出std::ios_base::failure
。由于您已经在检查FileCopy.fail()
,您可以将该检查扩展到其他故障情况(例如,检查FileCopy
在getline
期间没有故障,FileBackup
也没有故障(,而不是启用异常。