说endl
打印语句常常在调试程序时被添加,而这类语句应当保证“一直”刷新流
———————————Stanley B.Lippman——————————
在输出语句后添加endl成为一种习惯,常常只是当作回车-换行符使用
然而在多次打开同一文件读写的时候,在流输出语句后跟上endl,对保证文件内容顺序符合预期是至关重要的。
- 看下面一段代码:
ofstream outA;
ofstream outB;
/*以追加模式打开t.t*/
outA.open(“t.t”,ofstream::app);
outB.open(“t.t”,ofstream::app);
for(int i=0;i< 3;i++){
outA<<“pfd”;
outB<<“PFD”;
}
两个文件流轮番向文件t.t写入字符串,结果文件的内容是这样的:
PFDPFDPFDpfdpfdpfd
自成一派,有点意外,本来是轮番写入的,结果内容却没有如预期"交叉".
- 改一下代码:
ofstream outA;
ofstream outB;
outA.open(“t.t”,ofstream::app);
outB.open(“t.t”,ofstream::app);
for(int i=0;i< 3;i++){
/*每次写都刷新流*/
outA<<“pfd”<<endl;
outB<<“PFD”<<endl;
}
- 在每一条输出语句后面跟上endl,清空文件t.t,执行程序,再看看文件的内容:
pfd
PFD
pfd
PFD
pfd
PFD
- 交错分布,符合预期。
原因
看似写入文件的数据只是缓冲区中,endl保证数据被从缓冲区刷出。
而append模式要靠检测文件末尾来保证,如果outA写入的数据还在缓冲区中,自然文件末尾和outA执行写操作(outA<<“pfd”)前没有区别。
- 所以第一类代码的执行效果其实是outA和outB都向缓冲区写入数据,然后把数据追加到他们打开文件时读到的“文件末尾”。也就是说,outA和outB的读写没有更新文件末尾,自然得到的文件内容就是”各成一派“
而第二类代码保证每次写入操作都更新文件末尾,那么自然就会得到文件内容“交错分布”的结果。