C++ 为什么从文件输入时,默认值会在案例之前计算?

C++ 为什么从文件输入时,默认值会在案例之前计算?,c++,visual-c++,switch-statement,default,C++,Visual C++,Switch Statement,Default,我的程序遇到了一些与默认语句有关的问题。虽然 在代码中,我的案例似乎被跳过了,结果是输出看起来像这样,而不仅仅是“accountnumber”下面的数据,没有错误注释 Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSA

我的程序遇到了一些与默认语句有关的问题。虽然 在代码中,我的案例似乎被跳过了,结果是输出看起来像这样,而不仅仅是“accountnumber”下面的数据,没有错误注释

Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Error! INVALID TRANSACTION CODE! Account Number: 467343 Beginning Balance: $23750.4 Ending Balance: $2075.4 Interest Paid: $150 Amount Deposited: $6000 Number of Deposits: 3 Amount Withdrawn: $21825 Number of Withdrawls: 5 错误无效的交易代码! 错误无效的交易代码! 错误无效的交易代码! 错误无效的交易代码! 错误无效的交易代码! 错误无效的交易代码! 错误无效的交易代码! 账号:467343 期初余额:23750.4美元 期末余额:2075.4美元 利息:150美元 存款额:6 000美元 存款数目:3 提取金额:21 825美元 提款次数:5 如果去掉默认值,输出就可以了,但是如果事务代码不是有效的字母,我仍然需要它作为故障保护。如何在不删除默认值的情况下修复此问题

这是下面的文件和代码片段

467343 23750.40 W 250.00 D 1200 W 75.00 I 120.74 W 2500.00 W 3000 D 800 I 30.88 W 16000.00 D 4000.00 467343 23750.40 W 250.00 D 1200 W 75.00 I 120.74 W 2500.00 W 3000 D 800 I 30.88 W 16000.00 D 4000.00
infle>>转码>>跨装载;
而(!infle.eof())
{
交换机(转码)
{
案例“D”:
案例“d”:
acctBalance=末端平衡+变速箱安装;
已存入金额=交易金额+已存入金额;
存款数目++;
打破
案例“I”:
案例“i”:
endingBalance=endingBalance+变速箱安装;
interestPaid=interestPaid+transAmount;
打破
案例“W”:
案例“w”:
endingBalance=endingBalance-变速箱安装;
提取金额=提取金额+交易金额;
numberofdrawings++;
if(endingBalance>转码装载;

我假设
transCode
是一个
字符
,所以在文件的第一行(
467343 23750.40
)它被设置为
4
,然后
transAmount
被设置为单词的其余部分,
67343
。然后在下一个循环中
transCode
被设置为下一个字符,即
23570.40
开头的
2
,transAmount被设置为
3570.40


您需要执行一些操作,例如将行中的第一个单词读入字符串,然后查看它是有效代码还是数字。或者您可以在(!infle.eof())读取
transCode
并在读取
transAmount
之前检查它是一种代码气味-代码输入到哪里?@Tony:这是
而(!infle.eof())
被正确使用的一个罕见的例子。@LightnessRacesinOrbit:几乎-只有当最后一行被一些空格终止时,它才会正常工作,而体面的编辑器会强制执行这些空格(以换行的形式)但调试起来可能很麻烦。它也无法检查badbit,因此解析可能失败。@user3656280您是否尝试添加
std::cout请提供一个选项,或者这个问题应该结束。我也尝试过同样的可能性,但它没有解释“默认值”的这么多副本消息。@TonyD,当试图将
W
读取为双精度时,流的
failbit
不会被设置,并且在这之后不会更新
transCode
,所以它只会在相同的错误上循环?在任何情况下,
infle>>transCode>>transAmount
非常脆弱,无法处理一行中意外数量的字段,或者未执行的字段预期格式。我的想法是,如果
transCode
char
transAmount
a
double
float
,那么第一行被分解为4/67343,然后是2/3750.40,那么其他行也被成功解析…不会设置坏位,并且达到eof。总之,你对MC的评论“我在钱上。”@TonyD,你说得对……你比我想得更透彻:)
inFile >> transCode >> transAmount;

while (!inFile.eof())
{
    switch (transCode)
    {

    case 'D':
    case 'd':

        acctBalance = endingBalance + transAmount;

        amountDeposited = transAmount + amountDeposited;
        numberOfDeposits++;

        break;

    case 'I':
    case 'i':

        endingBalance = endingBalance + transAmount;

        interestPaid = interestPaid + transAmount;

        break;

    case 'W':
    case 'w':

        endingBalance = endingBalance - transAmount;
        amountWithdrawn = amountWithdrawn + transAmount;

        numberOfWithdrawls++;

        if (endingBalance < minimumBalance && !isServiceChared)
        {

            endingBalance = endingBalance - serviceCharge;

            isServiceChared = true;
         }
        break;

    default:
        cout << "Error! INVALID TRANSACTION CODE!" << endl;
        break;

    }

    inFile >> transCode >> transAmount;