ofstream写不进txt文件的奇怪问题

时间:2021-09-25 00:29:19

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"吧