2011-05-25 33 views
1

我已經編寫了一個程序,其中包含多個函數和多個函數,每個函數都在控制檯傳遞給控制檯時在控制檯上打印幾件東西。現在我正試圖在屏幕的中心打印所有內容,而不是屏幕的左上角。爲了這個目的,我唯一知道的就是Windows.h的gotoxy函數。現在這將是一件非常忙碌的工作,因爲我必須在每個「cout」之上放置gotoxy。有沒有辦法將光標設置到屏幕上的特定位置,並且每次打印都會從該特定位置開始打印。請在C++中建議比gotoxy更好的功能

回答

3

編寫一個接收要打印的字符串的小幫助函數(例如printCentered(std :: string))。該功能將光標移動到中心,然後打印參數。然後用這個函數的調用來替換你的cout。

+1

'std :: string'可以說是更好的選擇(或者至少是const char *')。 – 2011-05-25 18:48:01

+0

@Etienne謝謝。 – Hyperboreus 2011-05-25 18:52:09

+0

爲了實現這個東西,我必須推薦我正在試圖避免的整個程序。有什麼替代方案可以建議嗎? – Rafay 2011-05-25 18:59:46

0

假設你正在使用的cout寫入,該黑客應該做的工作:

#define AT_CENTER(stuff) goto(100, 100); cout << stuff; 

其中100,100應該使用特定的值來代替。然後使用:

AT_CENTER("The meaning of life is " << x); 
+1

這是非常醜陋的。 – 2011-05-25 18:52:58

+1

@Etienne:我自己是一個無神論者,我仍然想引用一個特定的聖書:「讓沒有罪的人投第一塊石頭」;) – 0xC0000022L 2011-05-25 18:56:38

+0

那麼,對於「可怕」的小值。你必須是一個敏感的靈魂 - 那裏更糟。我確實說這是一個黑客。實際上,我在所有的錯誤報告代碼中使用了非常相似的東西。 – 2011-05-25 18:57:37

2
  1. 不要使用cout或任何其他基於流的I/O繪製整個屏幕。如果流被重定向到不同的設備,「定位」流是沒有意義的。
  2. 直接調用Win32 console functions,如在控制檯程序中繪製狀態行的this example
1

下可以輕鬆的查找和替換,並採取光標設置爲中心的護理:

#include <iostream> 

std::ostream& PrintCentered(){ 
    // comment in the following if you're experiencing 
    // weird output due to io-buffering like @Ben says in a comment 
    //std::cout.flush(); 
    gotoxy(your_x, your_y); 
    return std::cout; 
} 

現在只要找到&上述功能取代你std::cout電話,你想讓它集中。替換後的用法應該如下所示:

PrintCentered() << "your message"; 
+0

+1:這就是爲什麼我害怕,並在同一件事,着迷於c + +:P – BlackBear 2011-05-25 19:15:46

+0

需要一些同步,因爲'cout'被允許被緩衝。 – 2011-05-25 19:24:00

+0

@Ben:你是什麼意思? – Xeo 2011-05-25 19:35:28