在OS X 10.8上,我嘗試通過bash將std輸入重定向到C++字符串。如何cin C++字符串> = 1024個字符通過bash shell?
打印完第1024個字符後,我甚至無法按回車。
您能否解釋問題出在哪裏以及如何解決?
在OS X 10.8上,我嘗試通過bash將std輸入重定向到C++字符串。如何cin C++字符串> = 1024個字符通過bash shell?
打印完第1024個字符後,我甚至無法按回車。
您能否解釋問題出在哪裏以及如何解決?
該問題與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
到了解你在做什麼以及它會有什麼其他影響(以及你是否想做其他事情)。
請向我們展示您的C++代碼。這個問題不太可能與bash有關。當你按回車時會發生什麼? –
@KeithThompson:它肯定看起來像bash不允許超過1024個字符的行在他的配置中...... –
@DavidRodríguez-dribeas:Bash不應該影響他的C++程序的執行。實際上,我們需要看到C++程序(或其更小的工作版本)*和*用於調用它的精確bash命令。 –