簡體   English   中英

使std :: cout一個接一個地輸出同一行中的多個字符串

[英]Make std::cout output multiple string in the same row one after the other

標題是亂七八糟的,看到代碼可能要快得多

p1_dado = rand() % 6 + 1;

        switch (p1_dado) {
        case 1:
            cout << ".-----." << endl;
            cout << "|     |" << endl;
            cout << "|  o  |" << endl;
            cout << "|     |" << endl;
            cout << "._____." << endl << endl;
            p1_somma = p1_somma + p1_dado;
            break;
        case 2:
            cout << ".-----." << endl;
            cout << "| o   |" << endl;
            cout << "|     |" << endl;
            cout << "|   o |" << endl;
            cout << "._____." << endl << endl;
            p1_ndadi--;
            break;
        case 3:
            cout << ".-----." << endl;
            cout << "|o    |" << endl;
            cout << "|  o  |" << endl;
            cout << "|    o|" << endl;
            cout << "._____." << endl << endl;
            p1_somma = p1_somma + p1_dado;
            break;
        case 4:
            cout << ".-----." << endl;
            cout << "| o o |" << endl;
            cout << "|     |" << endl;
            cout << "| o o |" << endl;
            cout << "._____." << endl << endl;
            p1_somma = p1_somma + p1_dado;
            break;
        case 5:
            cout << ".-----." << endl;
            cout << "| o o |" << endl;
            cout << "|  o  |" << endl;
            cout << "| o o |" << endl;
            cout << "._____." << endl << endl;
            p1_ndadi--;
            break;
        case 6:
            cout << ".-----." << endl;
            cout << "| o o |" << endl;
            cout << "| o o |" << endl;
            cout << "| o o |" << endl;
            cout << "._____." << endl << endl;
            p1_somma = p1_somma + p1_dado;
            break;
        }

我還要提一下,這段代碼在for循環中,因此switch case將運行4-5次。 這個輸出的方式是彼此重疊的所有骰子,有沒有辦法在1“行”中顯示所有骰子? 喜歡:

1 2 3 4 5

代替:

1
2
3
4
5

謝謝您的幫助 :)

假設您安裝了攔截和重新排列輸出的東西,實際輸出可以保持不變。 由於我傾向於從流的刷新中鍵入發送編譯行,唯一真正需要的改變是使用'\\n'替換過度使用std::endl 無論如何,這是我強烈建議的(有關解釋,請查看鏈接 )。

因此,假設有一個名為dicebuf的東西定義, main()函數可能看起來像這樣(有趣的部分是函數內的第一個定義):

int main()
{
    dicebuf buf(std::cout);

    for (int i = 0; i != 5; ++i)
    {
        int p1_dado = rand() % 6 + 1;
        switch (p1_dado) {
        case 1:
            std::cout << ".-----." << '\n';
            std::cout << "|     |" << '\n';
            std::cout << "|  o  |" << '\n';
            std::cout << "|     |" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        case 2:
            std::cout << ".-----." << '\n';
            std::cout << "| o   |" << '\n';
            std::cout << "|     |" << '\n';
            std::cout << "|   o |" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        case 3:
            std::cout << ".-----." << '\n';
            std::cout << "|o    |" << '\n';
            std::cout << "|  o  |" << '\n';
            std::cout << "|    o|" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        case 4:
            std::cout << ".-----." << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "|     |" << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        case 5:
            std::cout << ".-----." << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "|  o  |" << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        case 6:
            std::cout << ".-----." << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "| o o |" << '\n';
            std::cout << "._____." << '\n' << '\n';
            break;
        }
    }
}

這里的想法是dicebuf構造函數注入一個聚合行的自定義流緩沖區。 它只是不輸出東西,只是添加字符到當前行。 如果遇到換行符( '\\n' ),它將轉到下一行。 如果遇到連續的兩個換行符,則會假定有時間返回到頂部並繼續添加到當前行。

通過實現合適的流緩沖區(即,從std::streambuf派生的類)來創建攔截輸出的這種實用程序。 這是一個示例實現:

#include <utility>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>

struct dicebuf
    : std::streambuf
{
    std::ostream&                       out;
    std::streambuf*                     sbuf;
    std::vector<std::string>            rows;
    std::vector<std::string>::size_type row;
public:
    dicebuf(std::ostream& out)
        : out(out)
        , sbuf(out.rdbuf())
        , rows(1)
        , row(0) {
        out.rdbuf(this);
    }
    ~dicebuf() {
        this->sync();
        this->out.rdbuf(this->sbuf);
    }
    int overflow(int c) {
        if (c != std::char_traits<char>::eof()) {
            if (c == '\n') {
                if (this->rows[this->row].empty()) {
                    this->row = 0;
                }
                else {
                    ++this->row;
                    if (this->rows.size() == this->row) {
                        this->rows.push_back(std::string());
                    }
                }
            }
            else {
                this->rows[this->row].push_back(c);
            }

        }
        return std::char_traits<char>::not_eof(c);
    }
    int sync() {
        std::ostream out(this->sbuf);
        std::copy(this->rows.begin(), this->rows.end(),
                  std::ostream_iterator<std::string>(out, "\n"));
        this->sbuf->pubsync();
        this->row = 0;
        this->rows.resize(0);
        this->rows.push_back(std::string());
        return 0;
    }
};

與上面的main()一起,它應該根據需要產生輸出。 如果你想要多行結果,你只需注入一個刷新,例如,使用

std::flush;

在戰略要點。

代碼段:

char* hline = ".-----.";
char* dice[6][3] = { {"|     |", "|  o  |", "|     |" }, { ... }}; // 3 middle lines for each dice

for (int l=0; l < 5; ++l) {
  for(int i=0; i < 6; ++i) // or any random dice sequence with index = dice value - 1
    cout << (l == 0 || l == 4) ? hline : dice[i][l-1] << " ";
  cout << "\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM