rewind函数
/*
函数名: rewind
功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头
注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。 下面有FILE的结构体,rewind函数改变的是FILE结构体中的一个指针的指向。
用 法: void rewind(FILE *stream);
头文件:#include<stdio.h>
返回值:无
*/
mingw中FILE结构体的定义
typedef struct _iobuf
{
char* _ptr;//当前读的指针
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
linux中的FILE结构体的定义
typedef struct _IO_FILE FILE;
struct _IO_FILE {
int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
/* The following pointers correspond to the C++ streambuf protocol. */
/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
char* _IO_read_ptr; /* Current read pointer当前读的指针 */
char* _IO_read_end; /* End of get area. */
……
……//太多了,其余成员省略
};
//使用rewind()函数将一个文件重复读10次
//注意:以下源代码的文件名必须为vir.c,否则生成的exe文件名就不是vir.exe了(除非使用gcc编译器指定文件名),否则(in=fopen("vir.exe","rb"))==NULL就为真了,程序将退出。
#include<stdio.h>
int main()
{
int i;
FILE *in,*out[10];//定义指向输入、输出文件的指针,in指向输入文件,即程序本身。out[10]是指针数组,每一个元素指向一个输出文件
char *vir[10]={"vir0.exe","vir1.exe","vir2.exe","vir3.exe","vir4.exe",
"vir5.exe","vir6.exe","vir7.exe","vir8.exe","vir9.exe"}; /*定义一组指针数组,每一个指针元素指向一个字符串的首地址,该字符串即输出文件的文件名*/
if((in=fopen("vir.exe","rb"))==NULL) /*以二进制方式打开文件"vir.exe",如果出错就显示出错信息*/
{
printf("can't not open the infile");
exit(0);
}
for(i=0;i<10;i++) /*依以二进制方式次打开十个要创建的文件,如果出错就显示出错信息*/
{
if((out[i]=fopen(vir[i],"wb"))==NULL)
{
printf("can't not open the %d outfile",i+1);
exit(0);
}
}
for(i=0;i<10;i++) /*依次将vir.exe的内容复制到输出文件上,即vir0.exe、vir1.exe.......等文件获得vir.exe的内容*/
{
while(!feof(in)) //while执行完,vir.exe文件的位置指针就指向了文件的结尾
{
fputc(fgetc(in),out[i]);
}
rewind(in);//重置vir.exe文件的位置指针,将vir.exe文件的位置指针指向文件开头
}
for(i=0;i<10;i++) /*关闭vir.0、vir1、vir2.....*/
{
fclose(out[i]);
}
//vir.exe的执行是一个进程,进程在内存中,而vir.exe文件在磁盘上
fclose(in); /*关闭vir.exe文件,并不是关闭程序,程序执行完是执行到return 0;语句*/
return 0;
}