幾個文件處理函數(fseek,ftell,fread)

----------------------------幾個文件處理函數---------------------------------------------------
1.fseek
--------

相關函數:rewind, ftell, fgetpos, fsetpos, lseek
 
頭文件:#include <stdio.h>
 
定義函數:int fseek(FILE * stream, long offset, int whence);
函數說明:
 fseek()用來移動文件流的讀寫位置

1、參數stream 為已打開的文件指針
2、參數offset 為根據參數whence 來移動讀寫位置的位移數。參數 whence 為下列其中一種:
     SEEK_SET 從句文件開頭offset 位移量為新的讀寫位置. SEEK_CUR 以目前的讀寫位置往後增加offset 個位移量.
     SEEK_END 將讀寫位置指向文件尾後再增加offset 個位移量. 當whence 值為SEEK_CUR 或
     SEEK_END 時, 參數offset 允許負值的出現.
 
下列是較特別的使用方式:
 1) 欲將讀寫位置移動到文件開頭時:fseek(FILE *stream, 0, SEEK_SET);
 2) 欲將讀寫位置移動到文件結尾時:fseek(FILE *stream, 0, 0SEEK_END);
 
返回值:當調用成功時返回0, 若有錯誤則返回-1, errno 會存放錯誤代碼.
 
附加說明:fseek()不像lseek()會返回讀寫位置, 因此必須使用ftell()來去的目前的讀寫位置
 
範例:

 #include <stdio.h>
 main()
 {
     FILE * stream;
     long offset;
     fpos_t pos;
     stream = fopen("/etc/passwd", "r");
     fseek(stream, 5, SEEK_SET);
     printf("offset = %d\n", ftell(stream));
     rewind(stream);
     fgetpos(stream, &pos);
     printf("offset = %d\n", pos);
     pos = 10;
     fsetpos(stream, &pos);
     printf("offset = %d\n", ftell(stream));
     fclose(stream);
 }


 
-------------------------------------------------------------------------------------------
2.ftell
---------

頭文件:#include <stdio.h>
 
ftell() 函數用來獲取文件讀寫指針的當前位置。
原型為:
     long ftell(FILE * stream);
 
參數stream 為已打開的文件指針。
 
返回值:成功則返回當前的讀寫位置,失敗返回 -1。
 
對於二進制文件則返回從文件開頭到結尾的字節數。
 
對於文本文件,返回的數值可能沒有實際意義,但仍然可以用來保存當前的讀寫位置,供 fseek() 函數使用
 
使用fseek函數后再調用函數ftell()就能非常容易的確定文件的當前位置
 
ftell() 經常和 fseek() 一起使用。利用 ftell() 可以很方便的獲取一個文件的長: FILE *fp = fopen("demo.txt","rb");  
fseek(fp, 0L, SEEK_END);
len =ftell(fp)+1;首先將文件的位置指針移動到文件的末尾,然後調用函數 ftell() 獲取當前位置相對于文件首的位移,該位移值等於文件所含字節數。
 
實例:在讀取文件中的字符時,不斷的讀取文件指針的讀寫位置。 

#include<iostream.h>
#include<stdio.h>
void main(void)
{
    FILE* stream;
    long l;
    float fp;
    char s[81];
    char c;
    stream = fopen("fscanf.txt","w+");  // 打開
    if(stream == NULL) // 打開文件失敗
    {
        printf("the file is opeaned error!\n");
    }
    else //輸出信息
    {
        fprintf(stream,"%s %ld %f %c","a_string",6500,3.1415,'x');
        fseek(stream,0L,SEEK_SET); // 定位文件讀寫指針
        fscanf(stream,"%s",s);
        printf("%ld\n",ftell(stream));
        fscanf(stream,"%ld",&l);
        printf("%ld\n",ftell(stream));
        fscanf(stream,"%f",&fp);
        printf("%ld\n",ftell(stream));
        fscanf(stream," %c",&c);
        printf("%ld\n",ftell(stream));
   
        fclose(stream);  // 關閉
    }
}

-----------------------------------------------------------------------------------------------------------
3.fread
---------

頭文件:#include <stdio.h>
 
fread()函數用於從文件流中讀取數據,其原型為:
     size_t  fread(void *buffer, size_t size, size_t count, FILE * stream);
 
參數:buffer為接收數據的地址,size為一個單元的大小,count為單元個數,stream為文件流。
 
fread()函數每次從stream中最多讀取count個單元,每個單元大小為size個字節,將讀取到的數據放到buffer;文件流的位置指針後移 size * count 字節。
 
返回值:返回實際讀取的單元個數。如果小於count,則可能文件結束或讀取出錯;可以用ferror()檢測是否讀取出錯,用feof()函數檢測是否達到文件結尾。如果size或count為0,則返回0。
 
與fread()相對應的函數為fwrite(),fread() 和fwrite() 一般用於二進制文件的輸入輸出,ASCII文件不考慮。
 
實例:創建一個文件并寫入一些數據,然後讀取出來。 

#include <stdio.h>
void main( void )
{
    FILE *stream;
    char list[30];
    int i, numread, numwritten;
    // 以文本方式打?文件
    if( (stream = fopen( "fread.out", "w+t" )) != NULL )  // 如果讀取無誤
    {
        for ( i = 0; i < 25; i++ )
        list[i] = (char)('z' - i);
        numwritten = fwrite( list, sizeof( char ), 25, stream );
        printf( "Wrote %d items\n", numwritten );
        fclose( stream );
    }
    else
    {
        printf( "Problem opening the file\n" );
    }
    if( (stream = fopen( "fread.out", "r+t" )) != NULL )  // 文件讀取
    {
        numread = fread( list, sizeof( char ), 25, stream );
        printf( "Number of items read = %d\n", numread );
        printf( "Contents of buffer = %.25s\n", list );
        fclose( stream );
    }
    else
    {
        printf( "File could not be opened\n" );
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值