rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和eof标记,相当于调用fseek(stream, 0, SEEK_SET),其原型如下:
void rewind(FILE * stream);
【参数】stream为已打开文件的指针。
注意:准确的说,这里的指针不是文件指针stream,而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
文件指针FILE *stream中,包含一个读写位置指针char *_nextc,它指向下一次文件读写的位置。其结构如下:
typedef struct
{
int _fd; // 文件号
int _cleft; // 缓冲区中剩下的字节数
int _mode; // 文件操作模式
char * _nextc; // 下一个字节的位置
char * _buff; // 文件缓冲区位置
} FILE;
每当进行一次读写后,该指针自动指向下一次读写的位置。当文件刚打开或创建时,该指针指向文件的开始位置。可以用函数ftell( )获得当前的位置指针,也可以用rewind()/fseek()函数改变位置指针,使其指向需要读写的位置。
【实例】读取文件的数据后再回到开头重新写入。
#include<stdio.h>
#include <stdlib.h>
int main ()
{
FILE *fp;
char str[] = "www.dotcpp.com";
char second[] = "12345678";
fp = fopen( "dotcpp.txt" , "w" );
fwrite(str, sizeof(str) ,1, fp );
// rewind(fp);
// fwrite(second, sizeof(str) ,1, fp );
fclose(fp);
return(0);
}
fopen函数打开文件后,通过fwrite函数向文件中写入数据。运行结果如下:
使用rewind函数将文件指针重新指向文件头时,再调用fwrite函数向文件中写入数据,将会覆盖之前的数据。示例代码如下:
#include<stdio.h>
#include <stdlib.h>
int main ()
{
FILE *fp;
char str[] = "www.dotcpp.com";
char second[] = "12345678";
fp = fopen( "dotcpp.txt" , "w" );
fwrite(str, sizeof(str) ,1, fp );
rewind(fp);
fwrite(second, sizeof(str) ,1, fp );
fclose(fp);
return(0);
}
运行结果如下所示: