Функция C ++, которая возвращает строку, не работает, если не задействован endl ...? - PullRequest
0 голосов
/ 06 февраля 2009

У меня есть функция внутри класса, которая возвращает строку. Внутри этой функции я могу заставить ее работать, только когда добавляю cout<<endl к функции перед оператором return. Любая идея, почему это, или как я могу это исправить? Я запускаю это в Eclipse на Mac

В "main.cpp":

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include "Braid.h"
using namespace std;

static int size=3;

int main(){  
Braid * b1 = new Braid(size);
b1->setCanon();//creates canonical braid. 

cout<<"a ";
cout<<b1->getName()<<endl;
cout<<" b ";
}  

В "Braid.h":

  public:  
        Braid(int);  
        void setCanon();  
        string getName(); 
    };  

А в "Braid.cpp":

string Braid::getName(){  
    string sName="";  

    /* body commented out
    for(int i=0; i<height; i++)
    {
        for(int j=2; j<(width-2); j++)
            {
                sName += boxes[i][j];
                sName += "|";
            }
        }

        */  
        //cout<<endl;
        return sName;
    } 

Когда я запускаю свой основной код без тела этой функции, я получаю вывод
"a 0 | 0 | 12 | 12 | 0 | 0 | 2 | 1 | 1 | 1 | 1 | 2 |"

Возвращаемое им «имя» верное, но оно не проходит после вызова функции. Если я раскомментирую строку //cout<<endl, функция сработает, и мой вывод будет
"a 0 | 0 | 12 | 12 | 0 | 0 | 2 | 1 | 1 | 1 | 1 | 2 |
б "

После закомментирования тела функции, чтобы она только создала пустую строку и вернула ее, мой вывод будет только «a», тогда, если я добавлю endl обратно, я получу ожидаемое «ab».

Что я делаю не так? Что-то, что приходит с endl, что я скучаю?

Ответы [ 3 ]

12 голосов
/ 06 февраля 2009

фактически getName () функция, вероятно, работает правильно. Однако cout 'кэширует' вывод (то есть выводит вывод на экран, когда его внутренний текстовый буфер заполнен). 'endl' очищает буфер и заставляет cout выводить текст (в кеше) на экран.

Попробуйте cout.flush () в main.cpp

3 голосов
/ 06 февраля 2009

Может быть, ваш терминал ленивый. Попробуйте пропустить endl и вставить cout.flush() в качестве следующей строки.

2 голосов
/ 06 февраля 2009

cout должен быть очищен в конце программы.

fow@lapbert ~ % cat blah.cpp
#include <iostream>

int main() {
    std::cout << sizeof(int);
}
fow@lapbert ~ % ./a.out
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...