C++的标准输入输出 的一些有关问题

C++的标准输入输出 的一些问题

    下午继续研究外排序,想如果把文件读入成一块一块的处理,用手工去完善细节,代码可能会很乱,所以想着把这部分封装起来写一个AutoBuf类来处理,其实他就两个功能,一次性读入一个固定长度的整形串,然后每次有请求的时候返回Cur指向的那个数同时Cur++,一但遍历完buf就从文件继续读一批出来,同时用一个isLast记录是否已经是最后一块了,当读完最后一块时,再请求数据就会返回-1 表示没了。

 

    就这样一个简单的需求,因为我调试的时候输入语句有些问题,导致其实不是业务逻辑的错误而调试了一下午。其实我发现这样一个问题也很偶然,因为我发现当我打开的是小文件的时候,总是显示读入正常,而打开大文件,输出确实一片空白,但明明已经有读入数据的反应而且文件也很正常。

 

   现在就回顾一下我的发现

 

   

 ifstream in(".//data9-0.txt");
 int i=0;
 while( i<bufSize && in>>buf[i] )
 {
    cout<<buf[i]<<" ";
    ++i;
  }
 

   因为我封装ifstream时候老是出问题,所以我用不封装的试了下。问题依旧。


   

        int i=0;
	while( i<bufSize && in>>buf[i] )
	{
        //	cout<<buf[i]<<" ";
		++i;
	}
	cout<<endl<<"read:"<<i<<endl;
	for(int j=0;j<i;++j)
	{
		cout<<buf[j]<<endl;
	}
 

 

    然后我改成这样的输出语句,结果一下就正常了。多大的文件都可以读出。

 

    我继续尝试,在封装的里面输出,结果长的还是老问题。。我看了看这两个的区别,忽然想到,标准输入输出是有个缓冲的概念的,如果不显示调用flush输出缓冲的话,会一直覆盖,而endl其实是调用Flush的同时换行的。所以我将内部的调试语句改成

 

    

AutoBuf buf;
buf.AttachFile(".//data9-0.txt");
buf.read();
int tmp;
while((tmp=buf.autoGet())!=-1)
{
      cout<<tmp<<endl;
}

for(int j=0;j<buf.size;++j)
{
      cout<<buf.buf[j]<<endl;
}
 

 

    然后神奇的输出了。。。我真觉得伤不起啊,我以为是业务逻辑的问题,查看了一个多小时,结果居然是这样的问题。C++确实很多细枝末节会让人很头疼,不过发现问题解决了,多少还有点收获。

 

 

   大家以后写调试信息输出的时候,一定要记得flush缓冲,或者endl.......