我在一个返回字符串的类中有一个函数。在这个函数中,我只能在返回语句之前向函数添加cout<<endl
时才能使它工作。知道为什么会这样,或者我如何解决它?我在Mac上用Eclipse运行它
在“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 |
b“
在注释掉函数的主体之后,它只创建一个空字符串,并返回它,我的输出只是“a”然后如果我添加endl,我得到预期的“ab”。
我做错了什么?是否有一些我缺少的东西?
答案 0 :(得分:12)
实际上 getName()函数可能正常工作。但是,cout'缓存'输出(即当它的内部文本缓冲区已满时,它会在屏幕上打印输出)。 'endl'刷新缓冲区并强制cout将文本(在缓存中)转储到屏幕。
在main.cpp中尝试cout.flush()
答案 1 :(得分:3)
也许你的终端很懒。尝试省略endl
并插入cout.flush(
)作为下一行。
答案 2 :(得分:2)
cout
应在程序结束时刷新。
fow@lapbert ~ % cat blah.cpp
#include <iostream>
int main() {
std::cout << sizeof(int);
}
fow@lapbert ~ % ./a.out
4