fstream — C ++: Биллинговая программа Mock Catering Company — Не удалось вывести неверные данные в файл ошибок

Эта программа в основном должна считывать данные из файла, а затем обрабатывать эти данные в зависимости от того, что это такое. Это своего рода фиктивная кейтеринговая компания, и переменными являются число взрослых, количество детей, тип питания (роскошный или стандартный), тип дня (выходные (да или нет), первоначальный депозит и т. Д., А также дополнительная плата, налог , итоговое значение и т. д. рассчитывается в функции CalcData в зависимости от того, что это за данные (т. е. если это роскошный обед (D или S), цена составляет 25,80 долл. США вместо 21,75 долл. США (для стандарта), если это выходные дни ( Да или нет), доплата добавляется к общему счету, и предоставляются скидки в зависимости от общей суммы).

Хотя я думаю, что я злоупотребляю ссылками в своих функциях, программа работала нормально, без проверки ошибок (т. Е. Проверьте, что ввод был / является действительным — нет отрицательных значений для суммы взрослых / детей / начального депозита, никаких других букв, кроме S / D и / или Y / N и т. Д.). Сначала я использовал функцию «isValid», которая возвращала бы bool, и функцию «outputErrorFile», и использовал if / else в main — если данные были неверными, то выводили в файл ошибок, и если он не был недействительным , а затем просто вывести его в текстовый файл «Выписка по счету». С тех пор я объединил их в функцию «checkValid». Я думаю, делает то же самое, поэтому нет необходимости иметь две отдельные функции.

Прямо сейчас он выводит все в файл ошибок (в частности, переменная bool «valid» постоянно ложна для всех моих данных). Я уверен, что я делаю что-то глупое там. Меня не волнует, что выводится на консоль, меня волнует только то, что выводится в текстовые файлы … Спасибо за внимание.

Благодарю.

ВХОДНОЙ ФАЙЛ (взрослые, дети, роскошное или стандартное питание, выходные (да / нет), первоначальный депозит):

10 0 S Y 100,00

27 3 Д Д 57,50

125 17 D N 0,00

4 0 S N 25,00

0 25 S Y 23,75

250 43 Д N 500,00

0 0 Д Н 0.0

10 0 R Y 10.00

17 3 D R 15,00

5 0 Д Д 275,00

-3 10 Д Д 20,00

14 -1 S N 30,00

20 3 Д Д -10,00

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

void getData(int &, int &, char &, char &, float &);
void checkValid(int &, int &, char &, char &, float &, bool &);
void calcData(int, int, char, char, float, float &, float &, float &, float &);
void sendData(int, int, char, char, float, float &, float &, float &, float &);

ifstream inFile;
ofstream outFile("Billing_Statement.txt");
ofstream error_Report("Error_Report.txt");

//Declare the tax rate and weekend surcharge as constants.

const float taxRate = 0.18;
const float weekendSurcharge = .07;

int main()
{

bool valid = true;
float mealCost;
float totalTax;
float totalSurcharge;
float discountAmount;
int numAdults;
int numChildren;
char mealType;
char dayType;
float depositAmount;

cout << "\nThis program will calculate data for a catering company " << endl;

outFile << " Adults " << "Children  " << "Meal " << " Weekend " << setw(9) << "Deposit "<< setw(6) << "Tax" << setw(11) << "Surcharge" << setw(10) << "Discount" << setw(12) <<
"Meal Cost" << endl;
error_Report << " Adults " << "Children  " << "Meal " << " Weekend " << setw(9) <<
"Deposit " << endl;

inFile.open("file.txt");

if (!inFile) {
cout << "nError: File could not be opened. ";
exit(1);
}

while (!inFile.eof()) {

getData(numAdults, numChildren, mealType, dayType, depositAmount);
checkValid(numAdults, numChildren, mealType, dayType, depositAmount, valid);

if (valid == true)
{
calcData(numAdults, numChildren, mealType, dayType, depositAmount, totalTax,
totalSurcharge, discountAmount, mealCost);
sendData(numAdults, numChildren, mealType, dayType, depositAmount, mealCost,
totalTax, totalSurcharge, discountAmount);
}}

cout << "\nA copy of this has created for your convenience in the file,
\"Billing_Statement.txt \"" << endl;

inFile.close();
outFile.close();
error_Report.close();

return 0;

}

void getData(int &numAdults, int &numChildren, char &mealType, char &dayType, float
&depositAmount)
{
inFile >> numAdults >> numChildren >> mealType >> dayType >> depositAmount;
}

void checkValid(int &numAdults, int &numChildren, char &mealType, char &dayType, float
&depositAmount, bool & valid)
{

if (numAdults < 0 || numChildren < 0)
valid = false;
else if (mealType != 'D' || mealType != 'S')
valid = false;
else if (dayType != 'Y' || dayType != 'N')
valid = false;
else if (depositAmount < 0)
valid = false;

else
valid = true;

if (valid == false) {

error_Report << setw(7) << numAdults << setw(9) << numChildren << setw(6) << mealType <<
setw(9) << dayType << setw(9) << right << depositAmount << setw(8) << endl;
}
}

void calcData(int numAdults, int numChildren, char mealType, char dayType, float
depositAmount, float &totalTax, float &totalSurcharge, float &discountAmount, float
&mealCost)
{

if (mealType == 'S') {

mealCost = ((numAdults * 21.75) + (numChildren * (21.75 * .60)));
totalTax = mealCost * taxRate;
mealCost += taxRate;

if (dayType == 'Y') {
totalSurcharge = mealCost * weekendSurcharge;
mealCost += totalSurcharge;
}}

else {

mealCost = ((numAdults * 25.80) + (numChildren * (25.80 * .60)));
totalTax = mealCost * taxRate;
mealCost += taxRate;

if (dayType == 'Y') {
totalSurcharge = mealCost * weekendSurcharge;
mealCost += totalSurcharge;
}
}

if (mealCost < 100) {

discountAmount = .015 * mealCost;
mealCost -= discountAmount;
}

else if (mealCost >= 100 && mealCost < 400) {

discountAmount = .025 * mealCost;
mealCost -= discountAmount;
}

else if (mealCost >= 400) {

discountAmount = .035 * mealCost;
mealCost -= discountAmount;
}
}

void sendData(int numAdults, int numChildren, char mealType, char dayType, float
depositAmount, float &mealCost, float &totalTax, float &totalSurcharge, float
&discountAmount)
{
outFile << fixed << showpoint << setprecision(2);
outFile << setw(7) << numAdults << setw(9) << numChildren << setw(6) << mealType <<
setw(9) << dayType << setw(9) << right << depositAmount << setw(8) << totalTax <<
setw(10) << totalSurcharge << setw(10) << right << discountAmount << setw(12) << right
<< mealCost << endl;
}

0

Решение

Кажется, ваши проверки для типов, например

mealType != 'D' || mealType != 'S'

всегда будет давать true и поэтому, valid всегда установлен на false, Ты наверное имел ввиду

!(mealType == 'D' || mealType == 'S')

или переписан с булевой логикой

mealType != 'D' && mealType != 'S'

Кстати, в вашей программе тоже есть что-то не так. Например, есть одна из моих любимых мозолей: использование file.eof() контролировать входной цикл всегда неправильно! Вы либо обработаете последнюю строку дважды, либо, если где-то есть неверно отформатированный ввод, получите бесконечный цикл. Вы всегда Нужно проверить после пытаясь прочитать, если вход был успешным! Поток не может знать заранее, что вы будете пытаться прочитать и будет ли это успешным.

2

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

Других решений пока нет …

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