Странная проблема с std :: cout - PullRequest
1 голос
/ 24 марта 2011

У меня есть 2 петли:

//Loop 1
for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
    {
        cout << "-----IN LOOP----" <<  *iter;
    }

//Loop 2
for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
    {
        cout << "-----IN LOOP----" <<  *iter << endl ;
    }

Теперь vecv является строковым вектором и содержит 2 строки:

65 и A000 соответственно.

Теперь цикл 1 ничего не печатает, фактически кажется, что цикл вообще не работает.

Однако при добавлении endl, как вы видите в цикле 2, это дает следующий вывод:

-----IN LOOP----65
-----IN LOOP----$A000

Что именно происходит?

Имейте в виду, я столкнулся с этой проблемой только в Visual Studio 2010, а не в Dev-C ++ !!

Ответы [ 4 ]

3 голосов
/ 24 марта 2011

std::endl также очищает буфер. Если вы хотите выполнить сброс без разрыва строки, используйте std::flush.

2 голосов
/ 24 марта 2011

Откуда вы знаете, что ничего не печатается без endl?Наблюдая за запущенной программой?Если это так, проблема в том, что cout обеспечивает буферизованный вывод: он фактически печатает что-то на экране (или в файле) только тогда, когда его буфер заполнен.

endl в других руках очищает буфер.

Если вы хотите небуферизованный вывод, вы можете использовать cerr, но это приведет к некоторым различиям (например, теперь, если вы хотите перенаправить вывод в файл, вы должны сделать 2> вместо > и т. Д.).)

Если вы хотите получить буферизованный вывод, но не хотите переводить строки, выведите flush в cout.

0 голосов
/ 24 марта 2011

Вы не показываете полную программу, но я подозреваю, что она заканчивается на system("pause");, что часто встречается в руководствах по MSVC.Среда выполнения MSVC не очищает буфер вывода при вызове system() (это не требуется), поэтому весь вывод в std::cout остается в буфере, если не были выполнены std::flush, std::endl или ввод из std::cin.

Попробуйте запустить программу в окне консоли (Пуск-> Выполнить-> cmd.exe).Вывод должен появиться после завершения программы, даже без endl.

0 голосов
/ 24 марта 2011

Я думаю cout.clear() просто уничтожит буфер cout.Поскольку он не был очищен, значит, он потерян.

РЕДАКТИРОВАТЬ 1: Код, обеспечивающий:

#include <iostream>
#include <vector>

using namespace std;

int main(void) {

  vector<string> vecv;

  vecv.push_back("abc");
  vecv.push_back("def");

  //Loop 1
  for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
  {
    cout << "-----IN LOOP 1----" <<  *iter;
  }

  //Loop 2
  for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
  {
    cout << "-----IN LOOP 2----" <<  *iter << endl ;
  }
}

вывод:

./a.out
-----IN LOOP 1----abc-----IN LOOP 1----def-----IN LOOP 2----abc
-----IN LOOP 2----def
...