C ++ File I / O пропускает строку при каждой новой итерации, почему? - PullRequest
0 голосов
/ 14 ноября 2018

Почему программа пропускает первую строку каждого нового deptnum?

Я пытаюсь прочитать файл, который выглядит следующим образом:

1 Suits   0300 100 092
1 Coats   0200 060 065
1 Shirts  1000 012 013
2 Dresses 0400 060 065
2 Coats   0185 184 200
2 Shoes   0600 040 030
3 Jeans   0200 040 035
3 Shoes   0200 030 034
4 Jeans   0300 042 043

Дептнум - это первый столбец.

И когда я записываю в другой файл, я получаю:

                    Blinn Discount Apparel Company
                        Inventory Evaluation
                            10/12/2018

                     Unit Cost              Extended
      Quantity     Cost    Market       Cost     Market     Lower Cost
Mens Dept
 Suits         300   100.00     92.00     30000.00  27600.00
 Coats         200    60.00     65.00     12000.00  13000.00
 Shirts       1000    12.00     13.00     12000.00  13000.00
  Total                                  $54000.00 $53600.00    $53600.00
Womens Dept
 Coats         185   184.00    200.00     34040.00  37000.00
 Shoes         600    40.00     30.00     24000.00  18000.00
  Total                                  $112040.00 $108600.00    $108600.00
Girls Dept
 Shoes         200    30.00     34.00      6000.00   6800.00
  Total                                  $118040.00 $115400.00    $115400.00
Boys Dept
  Total                                  $118040.00 $115400.00    $115400.00
Total Inventory                                             $393000.00

Он пропустил Женский отдел -> Платья, Отдел девочек -> Джинсы и Отдел мальчиков -> Джинсы.

Вот мой код:

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

using namespace std;

int main()
{
ifstream inFile;
ofstream outFile;

int x = 1, deptnum, quant,cost,mkt,extcost,extmkt,totalcost = 0,totalmkt = 0,
lowcost,totalInv = 0;
char item [15];

inFile.open("blinn.dat");
outFile.open("blinn.dout");

if (!inFile)
    cout <<"\n\t\t Can't open data file: blinn.dat\n";


    else {
    outFile <<"\n\t                    Blinn Discount Apparel Company\n";
    outFile <<"\t                        Inventory Evaluation\n";
    outFile <<"\t                            10/12/2018\n";
    outFile <<"\n\t\t\t\t\t\t Unit Cost\t\t\t    Extended\n";
    outFile <<"\t\t  Quantity     Cost    Market       Cost     Market     Lower Cost";

    while (x < 5)
    {
        if (x == 1)
            outFile << "\nMens Dept";
        else if (x == 2)
            outFile << "\nWomens Dept";
        else if (x == 3)
            outFile << "\nGirls Dept";
        else if (x == 4)
            outFile << "\nBoys Dept";
        else
            break;

        while (inFile >> deptnum >> item >> quant >> cost >> mkt)
        {

            if (deptnum == x){

            extcost = quant * cost;
            extmkt = quant * mkt;

            outFile << left << "\n " << setw(7)<< item << "      "
                << right << setw(4)<< quant << "  "
                << right << setw(4) << cost << ".00    "
                << right << setw(3) << mkt << ".00     "
                << right << setw(5) << extcost<< ".00  "
                << right << setw(5) << extmkt << ".00";

                totalcost += extcost;
                totalmkt += extmkt;

                if (totalcost > totalmkt)
                    lowcost = totalmkt;
                else
                    lowcost = totalcost;


            }else
                break;
                }

            outFile << right << "\n  Total\t\t\t\t\t                 $" << totalcost << ".00 $"
                    << totalmkt << ".00    $"<< lowcost << ".00";

        x += 1;

            totalInv += lowcost;
    }
        }

outFile << "\nTotal Inventory\t\t\t\t\t\t                        $"<< totalInv<< ".00";


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

    return 0;
}

Что не так с моей логикой?

1 Ответ

0 голосов
/ 14 ноября 2018

В вашей логике есть проблема:

if (deptnum == x) {
    // do something
}
else {
    break;
}

Чтобы достичь ветви else, вы уже прочитали строку, которая deptnum != x (первая строка каждой новой deptnum), поэтомуна следующем итераторе текущая строка отбрасывается следующей строкой ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...