c ++ istream overloader输入数据不正确

时间:2014-10-11 07:56:46

标签: c++ iostream

//
// This is example code from Chapter 20.6.1 "Lines" of
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//

#include <std_lib_facilities.h>
#include <Windows.h>

const char NEW_LINE = '\n';

//------------------------------------------------------------------------------

typedef vector<char> Line;    // a line is a vector of characters

//------------------------------------------------------------------------------

class Document {
public:
    Document();// { line.push_back(Line()); }
    bool add(char ch);
    void print();
private:
    list<Line> _line;    // a document is a list of lines 
};

Document::Document()
: _line({ Line() })
{}

bool Document::add(char ch)
{
    Beep(0x25, 1);
    if (ch == NEW_LINE) {
        _line.emplace_back(Line());
    }
    _line.back().emplace_back(ch);

    return true;
}

void Document::print()
{
    if (_line.size()) {
        cout << endl;
        for (auto line_it = _line.begin(); line_it != _line.end(); ++line_it) {
            for (auto char_it = line_it->begin(); char_it != line_it->end(); ++char_it) {
                cout << *char_it;
            } // end char_it for loop
            cout << endl;
        } // end _line_it for loop
    } // end if block _line.size()
}
//------------------------------------------------------------------------------

istream& operator>>(istream& is, Document& d)
{
    char ch = 0;
    while (is.get(ch)) {
        if (ch == '[') {
            break;
        }
        d.add(ch);
        cout << "\nHERE";
    }
    return is;
}

//------------------------------------------------------------------------------

int main()
{
    Document d;
    cin >>  d;

    d.print();

    system("PAUSE");
}

//------------------------------------------------------------------------------

我试图让它输入一个项目,然后继续前进,而不必按Enter键。 IE如果我运行程序并键入S它应该立即调用d.add(ch)而不必按Enter键。我玩过&gt;&gt;所有形式的ch和is.get()以及is.peek()和is.read()。我还移动了is.get(ch)当前到while循环的不同部分的位置。一切都没有运气。现在我很可能没有正确地使用其中一个,一旦一个聪明的人在这里发帖,我就会打我的额头。请帮助我以正确的方式使用我正在使用的东西,或指向我正确的功能方向。

现在它只是让我输入一行文字然后按回车而不是输入所有内容。它已经很晚了我累了,并试图学习新的东西,所以除了非常感谢你的时间和精力。我也想说抱歉= p。

P.S。  请不要注意标题。一个是Stroustrup的标题,基本上包含了用于学习目的的所有常见内容。

0 个答案:

没有答案