1

我不知道为什么这个程序不打印任何东西,甚至是第一个打印语句。可能是什么问题?

它使用g++ filename.cpp.

#include "deck.h"
#include "hand.h"
#include <vector>
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    cout << "not even this";

    vector<Hand> hands;
    Deck deck;
    int players; 
    int seed;
    int sizeOfHand = 5;
    int i;
    vector<Hand>::iterator itr;

    cout << "Enter seed: ";
    cin >> seed;
    srand(unsigned(seed));

    cout << "Enter number of players: ";
    cin >> players; 

    for (i = 0; i < players; i++) {
        hands.push_back(Hand());
    }

    deck.Shuffle();
    for (i = 0; i < sizeOfHand; i++) {
        vector<Card> cards = deck.Deal(players);
        for (itr = hands.begin(); itr < hands.end(); itr++) {
            cout << "1";
            itr->add(*cards.begin());
            cards.erase(cards.begin());    
        }
    }

    for (itr = hands.begin(), i=1; itr < hands.end(); itr++, i++) {
        cout << "Player " + i;
        itr->showHand();
    }
}
4

3 回答 3

6

大多数操作系统出于性能原因缓冲您写入cout(或)的输出。cerr除非您刷新输出(例如,如果您还打印换行符,就会发生这种情况),您只会在缓存已满并刷新到标准输出时看到输出,因此在控制台窗口中变得可见。这个缓冲区可以容纳相当多的字符;可能是您的程序输出的所有内容。这种行为称为“行缓冲”。

有两种方法可以修复您的程序,具体取决于您实际想要的内容:

  1. 一种解决方案是每次希望输出可见时在代码中输出换行符:

    cout << "Enter a number: " << endl;
    

    换行符不会自动打印,因为人们可能想在之后写一些没有换行符的东西,例如当产生一行输出的逻辑被分成几行代码时,或者如果输出具有某种二进制性质。

  2. 要在不写换行符的情况下刷新输出,您还有两个选择:

    • cout.flush()打印后调用

      cout << "Enter a number: ";
      cout.flush();
      
    • stream std::flushinto cout,可以结合打印代码:

      cout << "Enter a number: " << flush;
      
于 2013-10-31T22:21:52.573 回答
3

就正在发生的事情而言,您的问题已经得到解答,但换行符并不是唯一的解决方案。

如果您希望输入与输出在同一行,您可以刷新:

cout << "Enter seed: " << flush;
cin >> seed;

请注意,实际上是在内部endl调用 a 。flush这与仅仅写作不同"\n"

于 2013-10-31T22:26:47.387 回答
3

您需要为您的流启用连续缓冲。在顶部添加main

std::cout << std::unitbuf;

这会导致流在每次输出操作后刷新。

于 2013-10-31T22:40:58.477 回答