如何解决我的输出的无休止循环?

时间:2019-05-06 16:31:52

标签: c++

我正在尝试从文本文件读取数据并将其显示在屏幕上。稍后,我将尝试按符号和增益百分比对行进行重新排序,但首先,我想使代码简单地读取并显示其中包含的内容。

我要回答的实际问题是:

(股票市场)编写一个程序来帮助本地股票交易公司自动化其系统。

该公司仅投资于股票市场。在每个交易日结束时,该公司都希望生成并发布其股票的上市信息,以便投资者可以看到他们当天所持股票的表现。我们假设公司投资了10种不同的股票。

所需的输出是产生两个清单,一个清单按股票代码排序,而另一个清单按百分比从最高到最低的百分比排序。

以以下格式在文件中提供输入数据:symbol openingPrice closingPrice todayHigh todayLow prevClose volume。例如,样本数据为:

分两步开发此编程练习。

  • 在第一步(a部分)中,设计和实现库存对象。

  • 在第二个步骤(b部分)中,设计并实现一个对象来维护库存清单。

a。 (库存对象)设计和实施库存对象。调用捕获库存对象stockType各种特征的类。

股票的主要成分是stock symbolstock pricenumber of shares

此外,我们需要输出opening priceclosing pricehigh pricelow priceprevious pricepercent gain/loss for the day

这些也是股票的所有特征。因此,库存对象应存储所有这些信息。

对每个库存对象执行以下操作:

  1. 设置库存信息。
  2. 打印库存信息。
  3. 显示不同的价格。
  4. 计算并打印增益/损耗百分比。
  5. 显示股份数。
    • a.1。库存清单的自然排序是通过库存代码进行的。重载关系运算符以按其符号比较两个库存对象。
    • a.2。重载插入运算符<<,以便于输出。
    • a.3。由于数据存储在文件中,因此请重载流提取运算符>>,以便于输入。例如,假设infileifstream对象,并且使用对象infile打开了输入文件。进一步假设myStockstock对象。然后,语句:infile >> myStock;从输入文件中读取数据并将其存储在对象myStock中。

b。现在,您已经设计并实现了类stockType来在程序中实现stock对象,现在该创建stock对象列表了。让我们调用该类以实现stock对象stockListType的列表。

  1. stockListType必须派生自您在上一个练习中设计和实现的类listType。但是,类stockListType是一个非常特殊的类,旨在创建库存对象列表。因此,类stockListType不再是模板。
  2. 添加和/或覆盖类listType的操作,以在库存清单上实施必要的操作。
  3. 以下语句从类stockListType派生出类listTypeclass stockListType: public listType { member list };
  4. 在类list中,用于保存list元素的成员变量,listSize的长度和最大值listType被声明为受保护的。因此,可以在类stockListType中直接访问这些成员。
  5. 由于该公司还要求您按收益/亏损百分比排序生成清单,因此您需要按此组件对库存清单进行排序。但是,您不应该按照组件的实际百分比来对列表进行排序。相反,您将针对此组件提供逻辑顺序。为此,添加一个成员变量,即一个数组,以保存按成分损益百分比排序的股票列表索引。将此数组称为sortIndicesGainLoss
    • a。当打印按组件百分比增益/损耗排序的列表时,请使用数组sortIndicesGainLoss来打印列表。
    • b。数组sortIndicesGainLoss的元素将告诉您接下来要打印的库存清单的哪个部分。

c。编写一个程序,使用这两个类来自动化公司对股票数据的分析。

这可能是我的最终目标,但我还没有尝试做它描述的一些事情。

我认为导致问题的部分在此处:

    void printScreen(ifstream &infile)
    {
        stockType in;
        stockType out;
        int count = 0;
        string line;

        cout << "********* First Investor's Heaven *********" << endl;
        cout << "*********    Financial Report     *********" << endl;
        cout << "Stock       Today           Previous Percent" << endl;
        cout << "Symbol   Open  Close   High   Low   Close  Gain   Volume" << endl;
        cout << "----- ----- -----  ----- ------ -------  -----" << endl;

        while (getline(infile, line))
        {
            count++;
        }

        for (int i = 0; i < count; i++)
        {
            infile >> in;
            cout << out;
        }

        cout << "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*";
    }

我的主要功能是:

    int main()
    {
        char repeat = ' ';
        string userSelection;

        int selection;


        ifstream infile;

        cout << "Please enter a filename of type .txt: ";
        cin >> userSelection;

        infile.open(userSelection);

        if (!infile)
        {
            cout << userSelection << " is not found. The program will now exect. Please ensure the filename is correct and the file is in the porper directory." << endl;
            exit(0);
        }

        do
        {
            selection = Menu();

            switch (selection)
            {
            case 1:
                printScreen(infile);
                break;
            case 2:
                exit(0);
                break;
            default:
                cout << "An error has occured, the program will now exit." << endl;
                exit(0);
            }
            cout << "If you would like to enter another file enter y. Otherwise the system will conclude: ";
            cin >> repeat;
        } while (repeat = 'y');

        infile.close();
        return 0;
    }

而我正试图利用这一点:

    ostream& operator << (ostream& out, stockType& temp)
    {
        char tab = '\t';

        out.imbue(locale(""));
        out << setprecision(2) << fixed;

        out << temp.getStockSymbol() << tab << setw(6) << temp.getOpeningPrice() << tab << setw(6) << temp.getClosingPrice() << tab << setw(7) << temp.getHighPrice() << tab << setw(8) << temp.getLowPrice() << setw(9) << temp.getPreviousPrice() << setw(10) << temp.getPercentGainLoss() << "%" << tab << setw(11) << temp.getStockShares() << endl;

        return out;
    }

    istream& operator>>(istream& in, stockType& obj)
    {
        string temp;
        double val;
        int x;

        in >> temp;
        obj.setStockSymbol(temp);

        in >> val;
        obj.setOpeningPrice(val);

        in >> val;
        obj.setClosingPrice(val);

        in >> val;
        obj.setHighPrice(val);

        in >> val;
        obj.setLowPrice(val);

        in >> val;
        obj.setPreviousPrice(val);

        in >> x;
        obj.setStockShares(x);

        return in;
    }

我的输出应该按照与读取输出相同的方式进行排序,但是我没有得到该符号的输出,并且得到了一个无尽的循环,似乎并没有读取所有内容。

1 个答案:

答案 0 :(得分:0)

为了显示文件的内容,您只需要使用一个循环即可遍历文件的内容,直到到达文件末尾。 试试:

char ch = infile.get();
while(ch != EOF) {
    cout << ch;
    ch = infile.get();
}
infile.clear();

或尝试:

 while (getline(infile, line)) {
        cout << line;
}