fseek rewind fopen fclose fread fwrite
int fseek(FILE *stream, long offset, int fromwhere);fseek 用於二進位制方式開啟的檔案,移動檔案讀寫指標位置.
fseek(in,-1L,1); -- 檔案流in, 零點為當前指標位置,SEEK_CUR 就是 1, -1L -- 檔案指標回退1個位元組int fseek( FILE *stream, long offset, int origin );
第一個引數stream為檔案指標
第二個引數offset為偏移量,整數表示正向偏移,負數表示負向偏移
第三個引數origin設定從檔案的哪裡開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 檔案開頭
SEEK_CUR: 當前位置
SEEK_END: 檔案結尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次為0,1和2.
簡言之:
fseek(fp,100L,0);把fp指標移動到離檔案開頭100位元組處;
fseek(fp,100L,1);把fp指標移動到離檔案當前位置100位元組處;
fseek(fp,100L,2);把fp指標退回到離檔案結尾100位元組處。 rewind
功 能: 將檔案指標重新指向一個流的開頭
用 法: int rewind(FILE *stream);函式原型: long ftell(FILE *fp)
函式功能:得到流式檔案的當前讀寫位置,其返回值是當前讀寫位置偏離檔案頭部的位元組數.
ftell函式
是用來獲取檔案的當前讀寫位置;函式原型: long ftell(FILE
*fp)
函式功能:得到流式檔案的當前讀寫位置,其返回值是當前讀寫位置偏離檔案頭部的位元組數.
ban=ftell(fp); 是獲取fp指定的檔案的當前讀寫位置,並將其值傳給變數ban.
fseek函式與ftell函式綜合應用:
分析:可以用fseek函式把位置指標移到檔案尾,再用ftell函式獲得這時位置指標距檔案頭的位元組數,這個位元組數就是檔案的長度.
freadfwrite,
1.用法:
int fread(void *buffer,int size,int count,FILE *fp);
int fwrite(void *buffer,int size,int count,FILE *fp);
2.功能:
fread()──從fp所指向檔案的當前位置開始,一次讀入size個位元組,重複count次,並將讀入的資料存放到從buffer開始的記憶體中; buffer是存放讀入資料的起始地址(即存放何處)。
fwrite()──從buffer開始,一次輸出size個位元組,重複count次, 並將輸出的資料存放到fp所指向的檔案中。buffer是要輸出資料在 記憶體中的起始地址(即從何處開始輸出)。 一般用於二進位制檔案的處理。
fopenfclose如果成功的開啟一個檔案, fopen()函式返回檔案指標, 否則返回空指標 (NULL)。由此可判斷檔案開啟是否成功。
FILE * p;
p = fopen(const char * path,const char * mode);
引數path:欲開啟的檔案路徑及檔名,引數mode:代表著流形態。
mode有下列幾種形態字串:
r :開啟只讀檔案,該檔案必須存在。
r+ :開啟可讀寫的檔案,該檔案必須存在。
w :開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ :開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a :增補, 如果檔案不存在則建立一個
a+:開啟或建立一個檔案增補
b :二進位制檔案(可以和上面每一項合用)
t : 文這檔案(預設項)
fclose()函式用來關閉一個由fopen()函式開啟的檔案
int fclose(FILE *stream);
該函式返回一個整型數。當檔案關閉成功時, 返回0, 否則返回一個非零值。 可以根據函式的返回值判斷檔案是否關閉成功。
檔案使用之後一定要關閉,否則將不能正確顯示內容.fwrite:讀入兩個學生資訊然後用fwrite存入檔案
fread:用fread從檔案中讀出學生資訊。
<pre name="code" class="cpp">fwrite.c
#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
main()
{
int i;
for(i=0;i<SIZE;i++)
{
scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
save();
}
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
}
fread.c
#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void read()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fread(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
main()
{
int i;
read();
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d,%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
printf("\n");
}
}
在C語言中進行檔案操作時,我們經常用到fread()和fwrite(),用它們來對檔案進行讀寫操作。下面詳細紹一下這兩個函式的用法。
我們在用C語言編寫程式時,一般使用標準檔案系統,即緩衝檔案系統。系統在記憶體中為每個正在讀寫的檔案開闢“檔案緩衝區”,在對檔案進行讀寫時資料都經過緩衝區。要對檔案進行讀寫,系統首先開闢一塊記憶體區來儲存檔案資訊,儲存這些資訊用的是一個結構體,將這個結構體typedef為FILE型別。我們首先要定義一個指向這個結構體的指標,當程式開啟一個檔案時,我們獲得指向FILE結構的指標,通過這個指標,我們就可以對檔案進行操作。例如:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char buffer[100] = "This is a test";
if((fp = fopen("c:\\example.txt", "w")) == 0)
{
printf("open failed!");
exit(1);
}
fwrite(buffer, 1, strlen("This is a test"), fp);
fclose(fp);
return 0;
}
通過以上程式碼,我們就在c盤的根目錄下建立了一個名為example副檔名為.txt的檔案,我們開啟可以看到上面寫上了This is a test。當我們對它將它讀出時,用如下程式碼:
#include <stdio.h>
#include <mem.h>
int main()
{
FILE *fp; int len;
char buffer[100];
/*memset(buffer, 1, 100); */
if((fp = fopen("c:\\example.txt", "r")) == 0)
{
printf("open failed!");
exit(1);
}
fseek(fp, 0L, SEEK_END);
len = ftell(fp);
rewind(fp);
fread(buffer, 1, len , fp);
printf("%s",buffer);
fclose(fp);
getch();
return 0;
}
可以看到,當我們使用memset了以後,讀出了一大堆亂碼,這是為什麼呢?原因是我們在fwrite函式時寫入的位元組數是用strlen求得的,也就是說字串最後的'\0'並沒有寫到檔案中去。所以我們從檔案中讀到buffer中時也自然沒有'\0',因為buffer中的數是隨機的,除非buffer中最後一個字元的下一個數恰好隨機到0(可能性很小,這裡用memset將它排除),否則以%s將buffer中的字元輸出時遇不到0,所以亂碼產生。解決的辦法有很多,你可以在向檔案寫資料時多寫入一個位元組,系統會自動寫入0,fwrite(buffer, 1, strlen("This is a test")+1, fp);這樣讀出時最後就有一個0了。或者讀出操作完成後,在最後一個字元後面補上一個0:buffer[len] = 0;這樣問題也可得到解決。