int fseek(FILE *fp,long d,int pos) f p是文件指针,d是位移量,p o s是起始点。 P o s的取值为: 0 :文件开始处 1 :文件的当前位置 2 :文件的尾部 位移量d是l o n g型的数据,可以为正或负值。表示从起始点向下或向上的指针移动。函数 的返回值若操作成功为0,操作失败为非零。 例如:f s e e k ( f p , 5 L , 0 );将文件指针从文件头向下移动5个字节。 f s e e k ( f p , - 1 0 L , 2 );将文件指针从当前位置向上移动1 0个字节。 rewind() 将文件指针移动到文件头。 ftell(FILE *fp) 返回文件指针的当前位置。 [例8-9] 写入5个学生记录,记录内容为学生姓名、学号、两科成绩。写入成功后,随机 读取第三条记录,并用第二条记录替换。 #include #include #define n 5 m a i n ( ) { FILE *fp1; / *定义文件指针* / char *temp; int i,j; struct stu{ / * 定义学生记录结构* / char name[15]; char num[6]; float score[2]; } s t u d e n t [ n ] ; if ((fp1=fopen("test.txt","wb"))==NULL) / *以二进制只写方式打开文件* / { printf("cannot open file"); e x i t ( 0 ) ; } for( i=0;i{ printf("input name:"); / *输入姓名* / g e t s ( s t u d e n t [ i ] . n a m e ) ; printf("input num:"); g e t s ( s t u d e n t [ i ] . n u m ) ; / *输入学号* / printf("input score1:"); g e t s ( t e m p ) ; / *输入一科成绩* / s t u d e n t [ i ] . s c o r e [ 0 ] = a t o f ( t e m p ) ; printf("input score2:"); g e t s ( t e m p ) ; / * 输入第二科成绩* / s t u d e n t [ i ] . s c o r e [ 1 ] = a t o f ( t e m p ) ; fwrite(&student[i],sizeof(struct stu),1,fp1);成 块/*写入*/ } fclose(fp1); /*关闭* / if ((fp1=fopen("test.txt","rb+"))==NULL) { /*以可读写方式打开文件* / printf("cannot open file"); e x i t ( 0 ) ; } p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - \ n " ) ; p r i n t f ( " % - 1 5 s % - 7 s % - 7 s % - 7 s \ n " , " n a m e " , " n u m " , " s c o r e 1 " , " s c o r e 2 " ) ; p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - \ n " ) ; for (i=0;i{ /*显示全部文件内容* / fread(&student[i],sizeof(struct stu),1,fp1); p r i n t f ( " % - 1 5 s % - 7 s % 7 . 2 f % 7 . 2 f \ n " , s t u d e n t [ i ] . n a m e , s t u d e n t [ i ] . n u m , s t u d e n t [ i ] . s c o r e [ 0 ] , s t u d e n t [ i ] . s c o r e [ 1 ] ) ; } / *以下进行文件的随机读写* / fseek(fp1,3*sizeof(struct stu),0)/;* 定位文件指针指向第三条记录*/ fwrite(&student[1],sizeof(struct stu),1,fp1); / * 在第三条记录处写入第二条记录* / rewind(fp1); /*移动文件指针到文件头* / p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - \ n " ) ; p r i n t f ( " % - 1 5 s % - 7 s % - 7 s % - 7 s \ n " , " n a m e " , " n u m " , " s c o r e 1 " , " s c o r e 2 " ) ; p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - \ n " ) ; for (i=0;i{ /*重新输出文件内容* / fread(&student[i],sizeof(struct stu),1,fp1); p r i n t f ( " % - 1 5 s % - 7 s % 7 . 2 f % 7 . 2 f \ n " , s t u d e n t [ i ] . n a m e , s t u d e n t [ i ] . n u m , s t u d e n t [ i ] . s c o r e [ 0 ] , s t u d e n t [ i ] . s c o r e [ 1 ] ) ; } f c l o s e ( f p 1 ) ; / *关闭文件* / }