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" );
}
}