2015-04-30 2 views
0

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

#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; 
} 

TEST FILE

#include "File.h" 

int main() 
{ 
    File myFile; 
    myFile.Create(); 
    myFile.Read(); 
} 
+0

В чем ваша проблема? – Buddy

+0

Например, когда я вводил нечисловую букву (A, B, C), программа останавливалась и переходила к функции 'Read()' –

+0

, что мне нужно сделать, когда я ввожу букву, появляется сообщение об ошибке и попросите пользователей повторно ввести. –

ответ

1

Вы не должны использовать исключения, если в «исключительных» случаях, когда программа не может легко восстановить (как плохое выделение памяти, ошибка открытие файла и т. д.). Проверка ввода может быть сделано гораздо более естественно с 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 читает правильно, то он будет конвертировать в booltrue и цикл не будет выполнен. Если нет (т. Е. Некоторый нецифровой ввод), то конечным результатом cin >> ... будет поток, который преобразуется в false. В этом последнем случае вам нужно очистить флаги ошибок (std::cin.clear()), затем удалить остальные оставшиеся символы в потоке (std::cin.ignore() часть) и повторить.

Смежные вопросы