C ++ команды, выполняющиеся не по порядку - PullRequest
6 голосов
/ 04 апреля 2011

Я пытаюсь создать простую программу-оболочку и, глядя на несколько примеров, увидел, что большинство людей используют getline () для получения ввода, однако я пытался использовать read () и заметил странную ошибку, которую яинтересно, видели ли другие люди или знали причину.

Когда я запускаю код с помощью getline, все работает нормально.После запуска программы я получаю имя терминала, и оно готово принять ввод.Когда я использую read, кажется, что после ввода ввода выполняется имя оболочки.Кажется, это происходит независимо от того, что я делаю.строка для отображения имени оболочки -

cout << "SweetShell-> ";

, а затем ПОСЛЕ этой строки я либо запускаю команду чтения, либо даже вызываю другой процесс, который затем запускает команду чтения, и в любом случае печатает «SweetShell->»происходит после ввода.

Еще более странно во время тестирования У меня был блок кода вроде:

cout << "SweetShell-> ";
int test = read(0,buf,MAX_ARGS);
//temp is a string that is set to the input
cout << temp << "    " << test;

и вывод выглядел примерно так:

    3SweetShell-> ls

значениеон напечатал пробелы, затем тест, затем первый cout и, наконец, temp.Кто-нибудь знает, что с этим происходит?

Ответы [ 4 ]

11 голосов
/ 04 апреля 2011

Вы должны попробовать "очистить" буфер вывода, чтобы убедиться, что он печатается по порядку.Попробуйте:

cout << "SweetShell-> " << std::flush;
int test = read(0,buf,MAX_ARGS);
//temp is a string that is set to the input
cout << temp << "    " << test << std::flush;
4 голосов
/ 04 апреля 2011

Важно то, что std::cout и std::cin связаны (см. http://www.cplusplus.com/reference/iostream/ios/tie/) - это означает, что потоковые операции на std::cin сначала вызовут сброс на std::coutНо вы используете функцию libC read(...), которая полностью обходит библиотеку потоков C ++, поэтому нет возможности для вызова сброса. Вместо этого можно использовать std::cin.read().

4 голосов
/ 04 апреля 2011

Поскольку выход буферизован, вам нужно flush вывод, прежде чем пытаться read() ваш ввод.

Кстати, будьте осторожны при объединении необработанных операций уровня read(2) и write(2) на уровне ОС с буферизованными операциями ввода-вывода; хотя вы, безусловно, можете использовать их обоих в одной программе, использование обоих в одном и том же файле или сокете создаст проблемы; поэтому придерживаться той или иной формы уменьшит вероятность появления недостатков в будущем.

0 голосов
/ 04 апреля 2011

Почему бы не использовать cin >> test?Я всегда использую <iostream> функции для консольного ввода / вывода;они работают очень хорошо.

...