2013-01-16 73 views
3

在OS X 10.8上,我嘗試通過bash將std輸入重定向到C++字符串。如何cin C++字符串> = 1024個字符通過bash shell?

打印完第1024個字符後,我甚至無法按回車。

您能否解釋問題出在哪裏以及如何解決?

+4

請向我們展示您的C++代碼。這個問題不太可能與bash有關。當你按回車時會發生什麼? –

+0

@KeithThompson:它肯定看起來像bash不允許超過1024個字符的行在他的配置中...... –

+1

@DavidRodríguez-dribeas:Bash不應該影響他的C++程序的執行。實際上,我們需要看到C++程序(或其更小的工作版本)*和*用於調用它的精確bash命令。 –

回答

4

該問題與bash或與C++代碼無關。爲了驗證這一點,這個簡單的程序有同樣的問題:

#include <iostream> 
#include <string> 
int main(int, char**) { 
    std::string s; 
    std::getline(std::cin, s); 
} 

所以做到這一點Python程序:

#!/usr/bin/python 
raw_input() 

而且你可以嘗試下不同的炮彈運行,並看到它沒有什麼區別。

的問題是一個TTY在行模式中,始終有一個最大的線路長度,而這一次碰巧有1024

因此,一個最大的線路長度,這甚至不是一個真正的編程問題;這是一個TTY問題。這就是爲什麼你可以在superuser.com而不是這裏找到dup的原因。參見那裏討論處理這個問題的各種方法。

但是,如果你想從你的程序中處理它,而不是全球範圍內,你可以檢查stdin是否爲tty,如果是使用termios功能將暫時關閉行模式。例如,像這樣:

#include <iostream> 
#include <string> 
#include <termios.h> 
#include <unistd.h> 

int main(int, char**) { 
    struct termios told; 

    if (isatty(STDIN_FILENO)) { 
    tcgetattr(STDIN_FILENO, &told); 
    struct termios tnew = told; 
    tnew.c_lflag &= ~ICANON; 
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &tnew); 
    } 

    std::string s; 
    std::getline(std::cin, s); 

    if (isatty(STDIN_FILENO)) { 
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &told); 
    } 
} 

但是,你顯然希望真正的錯誤處理,你可能會想使用RIAA藏匿,並恢復原來的termios設置,你或許應該閱讀man termios到了解你在做什麼以及它會有什麼其他影響(以及你是否想做其他事情)。