C語言檔案流操作的二進位制讀寫和定位(fwrite、fread、fseek)
二進位制寫檔案中用到fwrite函式,這個函式對檔案進行寫操作的時候寫進去的資料就是二進位制的資料包括後面的fread函式,進行讀操作的時候也是直接讀二進位制,這也是在對檔案操作時,這兩個函式與fprintf和fscanf的區別。讀檔案操作程式碼中用到了fseek函式,fseek可以定位到指標指向檔案的任意位置,格式:
int fseek(FILE *stream, long offset, int fromwhere);第一個引數代表操作哪個檔案,第二個引數是移動的位元組數,可以是正負數,負數代表往前數字節,正數代表往後數字節,第三個引數代表從哪個地方開始,可以從開頭開始,可以從當前位置開始,也可以從結尾開始。
//二進位制檔案寫檔案
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
int sno;
char name[10];
}student;
int main ()
{
FILE * fp;
int i;
student stu[5];
stu[0].sno=201701;strcpy(stu[0].name,"li");
stu[1].sno=201702;strcpy(stu[1].name,"wang");
stu[2].sno=201703;strcpy(stu[2].name,"zhang");
stu[3].sno=201704;strcpy(stu[3].name,"zhao");
stu[4].sno=201705;strcpy(stu[4].name,"huang");
if((fp = fopen ("myfile","wb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<5;i++)
{
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)//fwrite執行成功的返回值是fwrite函式的第三個引數
printf("file writeerror\n");
}
fclose (fp);
return 0;
}
//二進位制讀檔案操作
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
int sno;
char name[10];
}student;
int main () {
FILE * fp;
student stu;
long a;
if((fp=fopen("myfile","rb"))==NULL) //rb代表按照二進位制的方式進行讀
{
printf("cant open the file");
exit(0);
}
//fread函式如果讀成功返回的值是fread函式的第三個引數,此時為1
while(fread(&stu,sizeof(student),1,fp)==1) //如果讀到資料,就顯示;否則退出
{
printf("%d%s\n",stu.sno,stu.name);
}
//因為student結構體佔14個位元組,不知道為什麼後面自動加兩個位元組
//所以定位按行輸出只能定位到每行的行首,即距檔案開端16的倍數字節處
printf("輸入您要定位的位元組數(只能為0,32,48,64\n");
scanf("%ld",&a);
fseek(fp,a,0);
if(fread(&stu,sizeof(student),1,fp)==1)
{
printf("%d%s\n",stu.sno,stu.name);
}
return 0;
}