1. 程式人生 > >fseek rewind fopen fclose fread fwrite

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;這樣問題也可得到解決。