#include <iostream>
#include <stdarg.h>
#include <vector>
#include <fstream>
#include <exception>
#include <string>
#include <stdexcept>
#include <sstream>
using namespace std;
class FileError :public runtime_error {
public:
FileError(const string& fileIn) : runtime_error(""), mFile(fileIn) {}
virtual const char* what() const throw () { return mMsg.c_str(); }
string getFileName() { return mFile; }
protected:
string mFile, mMsg;
};
class FileOpenError : public FileError {
public:
FileOpenError(const string& fileNameIn);
};
FileOpenError::FileOpenError(const string& fileNameIn) : FileError(fileNameIn)
{
mMsg = "Unable to open " + fileNameIn;
}
class FileReadError :public FileError {
public:
FileReadError(const string& fileNameIn, int lineNumIn);
int getLineNum() { return mLineNum; }
protected:
int mLineNum;
};
FileReadError::FileReadError(const string& fileNameIn, int lineNumIn) : FileError(fileNameIn), mLineNum(lineNumIn)
{
ostringstream ostr;
ostr << "Error reading" << fileNameIn << " at line " << lineNumIn;
mMsg = ostr.str();
}
void readIntegerFile(const string& fileName, vector<int>& dest) throw(FileOpenError, FileReadError)
{
ifstream istr;
int temp;
string line;
int lineNumber = 0;
istr.open(fileName.c_str());
if (istr.fail()) {
throw FileOpenError(fileName);
}
while (!istr.eof()) {
getline(istr, line);
lineNumber++;
istringstream lineStream(line);
while (lineStream >> temp) {
dest.push_back(temp);
}
if (!lineStream.eof()) {
istr.close();
throw FileReadError(fileName, lineNumber);
}
}
istr.close();
}
int main()
{
const string fileName = "IntergerFile.txt";
vector<int> dest;
try {
readIntegerFile(fileName, dest);
}
catch (const FileError& e) {
cerr << e.what() << endl;
return 1;
}
for (size_t i = 0; i < dest.size(); i++) {
cout << dest[i] << " ";
}
cout << endl;
return 0;
}
编写自己的异常类
最新推荐文章于 2023-03-31 14:34:28 发布