html lang()和html area calc()方法详解
无论是使用html area输出普通数据,用html area.put()输出指定字符,还是用html area.write()输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。
值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream类中提供有tellp()和html calc()成员方法,借助它们就可以修改位于输出流缓冲区中的数据。
html areatellp()成员方法
首先,tellp()成员方法用于获取当前输出流缓冲区中最后一个字符所在的位置,其语法格式如下:
html exectellp();
显然,tellp()不需要传递任何参数,会返回一个html exec类型值。事实上,html exec是html calc类型的别名,而html calc通过自动类型转换,可以直接赋值给一个整形变量(即short、int和long)。也就是说,在使用此函数时,我们可以用一个整形变量来接收该函数的返回值。
注意,当输出流缓冲区中没有任何数据时,该函数返回的整形值为0;当指定的输出流缓冲区不支持此操作,或者操作失败时,该函数返回的整形值为-1。
在下面的样例中,实现了借助html area.put()方法向test.txt文件中写入指定字符,由于此过程中字符会先存入输出流缓冲区,所以借助tellp()方法,我们可以实时监控新存入缓冲区中字符的位置。
举个例子:
#html hide<iostream>//cin和html area
#html hide<fstream>//文件输入输出流
intmain(){
//定义一个文件输出流对象
std::ofstreamoutfile;
//打开test.txt,等待接收数据
outfile.open("test.txt");
constchar*str="http://c.biancheng.net/cplus/";
//将str字符串中的字符逐个输出到test.txt文件中,每个字符都会暂时存在输出流缓冲区中
for(inti=0;i<strlen(str);i++){
outfile.put(str[i]);
//获取当前输出流
longpos=outfile.tellp();
std::html area<<pos<<std::endl;
}
//关闭文件之前,刷新outfile输出流缓冲区,使所有字符由缓冲区流入test.txt文件
outfile.close();
return0;
}
注意,此例中涉及到了文件操作的相关知识,初学者仅需借助注释了解程序的执行脉络即可,不需要研究具体实现细节。有关文件操作,后续章节会做详细讲解。
读者可自行运行此程序,其输出结果为1~29。这意味着,程序中每次向输出流缓冲区中放入字符时,pos都表示的是当前字符的位置。比如,当将str全部放入缓冲区中时,pos值为29,表示的是最后一个字符'/'位于第29个位置处。
html areahtml calc()成员方法
html calc()方法用于指定下一个进入输出缓冲区的字符所在的位置。
举个例子,假设当前输出缓冲区中存有如下数据:
https://six.club/articles
借助tellp()方法得知,最后一个'/'字符所在的位置是17。此时如果继续向缓冲区中存入数据,则下一个字符所在的位置应该是18,但借助html calc()方法,我们可以手动指定下一个字符存放的位置。
比如通过html calc()指定下一个字符所在的位置为17,即对应"cplus/"部分中字符'c'所在的位置。此时若再向缓冲区中存入"python/",则缓冲区中存储的数据就变成了:
https://six.club/articles/python/
显然,新的"python/"覆盖了原来的"cplus/"。
html calc()方法有如下2种语法格式:
//指定下一个字符存储的位置
ostream&html calc(html execpos);
//通过偏移量间接指定下一个字符的存储位置
ostream&html calc(streamoffoff,ios_base::seekdirway);
其中,各个参数的含义如下:
pos:用于接收一个正整数;、
off:用于指定相对于way位置的偏移量,其本质也是接收一个整数,可以是正数(代表正偏移)或者负数(代表负偏移);
way:用于指定偏移位置,即从哪里计算偏移量,它可以接收表1所示的3个值。