Обработка файлов с использованием try-catch Stack Overflow

Я работаю над проектом по обработке файлов. Пользователи вводят идентификатор, часы и оплату. Выходными данными будут ID, часы, payrate и grosspay. Я сделал эти части сделано. Мне действительно нужна помощь, чтобы попытаться поймать, когда пользователи вводят нечисловые значения, проект отклоняет их и просит пользователей вводить снова.
Вот что я получил так далеко:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <iomanip>
#include "File.h"#include <exception>
using namespace std;

void File::Create()
{
ofstream outClientFile("payroll.txt", ios::out);

if (!outClientFile)
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}

cout << "Enter employee ID, hours and payrate" << endl
<< "Enter end-of-file to end input.\n? ";

while (cin >> id >> hours >> payrate)
{
try
{
outClientFile << id << ' ' << hours << ' ' << payrate << endl;
cout << "? ";
}
catch (exception elementException)
{
cerr << ("Invalid input. Try again") << endl;
}
}
}
void outputLine(int, float, float, float);
void File::Read()
{
ifstream inClientFile("payroll.txt", ios::in);

if (!inClientFile)
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}

cout << left << setw(15) << "Employee ID" << setw(15) << "Hours" << setw(15) << "Payrate" << setw(15) << "Grosspay" << endl << fixed << showpoint;

while (inClientFile >> id >> hours >> payrate)

outputLine(id, hours, payrate, grosspay = hours * payrate);
}
void outputLine(int id, float hours, float payrate, float grosspay)
{
cout << left << setw(7) << id << setprecision(2) << setw(8) << " , " << setw(8) << hours << setprecision(2) << setw(7)
<< " , " << "$"  << setw(7) << payrate << setprecision(2) << setw(7) << " , " << "$"  << grosspay << right << endl;
}

Тестовый файл

#include "File.h"
int main()
{
File myFile;
myFile.Create();
myFile.Read();
}

0

Решение

Вы не должны использовать исключения, кроме как в «исключительных» случаях, когда программа не может легко восстановиться (например, неправильное распределение памяти, ошибка при открытии файла и т. Д.). Подтверждение ввода может быть сделано гораздо более естественно с while петля, вот так:

while( ! (std::cin >> id >> hours >> payrate) ) // repeat until we read correctly
{
std::cout << "Invalid input, try again..." << std::endl;
std::cin.clear(); // clear the error flags
// ignore the rest of the stream, must #include <limits>
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
// now we can write the result to the file, input was validated
outClientFile << id << ' ' << hours << ' ' << payrate << endl;

Если cin читает правильно, затем он будет преобразован в bool true и цикл не будет выполнен. Если нет (то есть некоторый нечисловой ввод), то конечный результат cin >> ... будет поток, который преобразуется в false, В последнем случае вам необходимо очистить флаги ошибок (std::cin.clear() часть), затем удалите оставшиеся символы в потоке (std::cin.ignore() часть) и повторить.

1

Другие решения


По вопросам рекламы [email protected]