double m_b[M][N]={0};
string filePath = "file.txt";
ofstream file(filePath.c_str());
//下面三种都可以写进去
//file<<"i love"<<endl;
//file<< 1.23 <<endl;
//file<< m_b[0][0]<<endl;
//下面这样确一直写不进去
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
file<< m_b[i][j]<< " ";
}
}
很奇怪不论" " 里面写什么,txt里面都是空的,而 将file<< m_b[i][j]<< " ";
改成file<< m_b[i][j]<< endl; 时txt不是空的,可以写进去,太奇怪了。
后来发现 我是在这后面设置断点,来查看的,因为没有刷新txt内容,所以没有显示。
STLPort中的实现如下:
_CRTIMP inline basic_ostream<wchar_t, char_traits<wchar_t> >&
__cdecl endl(basic_ostream<wchar_t,
char_traits<wchar_t> >& _O)
{_O.put('\n');
_O.flush();
return (_O); }
它的工作其实就是输出一个“\n”,不过后面又带了一句flush(),这一句是强制刷新缓冲区的。
如果后面直接写上 file.close()时,txt会有所写进去的内容。
因为fstream.close() 会flush(),添加结束标志。
而endl行标志结束,也会flush()一下,所以这时候设断点查看txt也会出现。
另外引申:
如果每次输出都刷新缓冲区那就会影响到程序的性能,无法使用缓冲区的优点,所以使用的时候考虑是不是在很多地方需要endl,如果可以还是换成"\n"吧