C语言中的刷新和定位函数
一.fflush
1.fflush的原型如下:
int fflush(FILE *stream);
2.当需要立即把输出缓冲区的数据进行物理写入时,应该使用这个函数。例如调用fflush函数保证调试信息实际打印出来,而不是保存在缓冲区中直到以后才打印。
二.定位函数
1.在正常情况下,数据以线性的方式写入,这意味着后面写入的数据在文件中的位置是在以前所有写入数据的后面。C同时支持随机访问I/O,也就是以任意顺序访问文件的不同位置。随机访问是通过在读取或写入前,先定位到文件中需要的位置来实现的。
2.定位函数原型:
1>long ftell(FILE *stream);
2>int fseek(FILE *steam,long offset,int from);
3.ftell函数返回流的当前位置。即:下一个读取或写入将要开始的位置距离文件起始位置的偏移量。该函数允许保存一个文件的当前位置。
1>在二进制流中,这个值就是当前位置距离文件起始位置之间的字节数。
2>在文本流中,这个值表示一个位置,但它并不一定准确地表示当前位置和文件起始位置之间的字符数,因为有些系统将对行末字符进行翻译转换。但是,ftell函数返回的值总是可以用于fseek函数中,作为一个距离文件起始位置的偏移量。
4.fseek函数允许你一个流中定位。这个函数将改变下一个读取或写入操作的位置。它的第 1个参数是需要改变的流。它的第2和第3个参数标识文件中需要定位的位置。
1>试图定位到一个文件的起始位置之前是一个错误。定位到文件尾并进行写入将扩展这个文件。定位到文件尾之后并进行读取将导致返回一条“到达文件尾”的信息。
2>在二进制流中,从SEEK_END进行定位可能不被支持,所以应该避免。
3>在文本流中,如果from是SEEK_CUR或SEEK_END,offset必须是零。如果from是SEEK_SET,offset必须是一个从同一个流中以前调用ftell所返回的值。
5.用fseek改变一个流的位置会带来三个副作用。
1>首先,行末指示字符被清除。
2>其次,如果在fseek之前使用ungetc把一个字符返回到流中,那么这个被退回的字符会被丢弃,因为在定位操作以后,它不再是“下一个字符”。
3>最后,定位允许你从写入模式切换到读取模式,或者回到打开的流以便更新。