2014-09-22 137 views
0

我想寫一個程序,與一些需要命令開始與轉義字符(ascii 27)的儀器進行交互,但我有麻煩測試,因爲程序似乎掛起試圖打印轉義字符。這個程序被編譯以在Ubuntu機g ++以及從侏儒末端運行:c + +不能打印轉義字符

#include <cstdlib> 
#include <iostream> 
#include <unistd.h> 
#include <limits> 

using namespace std; 

int main() 
{ 
    string str; 
    const int numSamples=10; 
    const int escapeInt = 27; 
    const char escapeChar = escapeInt; 

// sleep(30); 
    //Ask for the latest test results 
    cin.clear(); 
// cin.ignore(numeric_limits<streamsize>::max()); 
    cout << "\n\n\n"; 
    cout << escapeChar << "PF2 -" << numSamples; 
    cerr << "\n\n\n" << escapeChar << "PF2 -" << numSamples; 
// cin.ignore(2,'\n'); 
    getline(cin, str, '\n'); 
    cerr << str; 

    int k=1; 
    while (k<=numSamples)//getline(cin, str)) 
    { 
     getline(cin, str, '\n'); 
     k++; 
     cerr << str << endl; 
    } 

    return 0; 
} 

輸出是隻有三個空白行,然後程序變得無法響應。它甚至不響應ctrl-c。有關如何解決此問題的任何建議?

+1

你正在將你的輸出(包括轉義字符)發送到'cout',這聽起來像是你的終端(因爲你說你看到三條空白行)。你打算如何使儀器命令真正到達儀器? – 2014-09-22 23:01:24

+0

你確定數據流正在被引導到正確的地方嗎?一個明顯的解釋是如果終端(或某些Linux服務)被轉義序列弄糊塗了。 – Steve314 2014-09-22 23:01:53

+0

我使用cout,因爲我將使用socat(如果您熟悉它)通過tcp/ip將此程序的stdout連接到telnet會話。我做了一個關於這個連接兩個socat會話的虛擬運行,從一個會話運行stdio到另一個會話的stdio。這導致程序會話的輸出端(打印stderr到屏幕)凍結,而另一個會話完成併成功退出。 – 2014-09-22 23:07:13

回答

-1

哦,我可以回答我自己的問題。正如@Alf所建議的那樣(謝謝),我似乎不應該試圖將轉義序列打印到cerr,因爲我的終端會解釋這個轉義序列,在我的情況下,使用gnome-terminal時,它是否定的-沒有。

感謝有用的見解人!