1. 程式人生 > >C語言函式fread() , fwrite() ,fseek()用法分析

C語言函式fread() , fwrite() ,fseek()用法分析

網上已經有不少關於c語言函式fread() 和fwrite() 用法分析的文章,在此將這兩個函式的用法寫下來,是為了鞏固所學,加深印象,也為了日後方便查詢複習比較,如果能幫助到某些朋友,則是意外的驚喜。

fwrite()函式的意義是將某二進位制資料寫到指定的 檔案流。函式的原型為: 

 size_t fwrite (const void *buffer, size_t size, size_t num, FILE *stream)

四個函式引數的意義分別為:1、const  void *buffer 為指向二進位制資料來源的指標;2、size_t size 為每個資料單元所佔的位元組數;

3、size_t num 為需要讀取的資料單元的個數; 4、FILE *stream 為目的檔案指標。

返回值為實際寫入目的檔案的資料單元個數。 範例如下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
	FILE *lb;
	char a[] = "Time is fast";

	if (NULL == (lb = fopen("test.txt", "w+")))   //!<開啟檔案
	{
		printf("Fail to open the file");
		exit(EXIT_FAILURE);
	}

	fwrite( a, sizeof(a), 1, lb);  //!<把a中資料寫入檔案lb
	fclose(lb);

	return ;
}

函式fseek()的原型是:int fseek(FILE *stream, long offset, int fromwhere)

後兩個引數的意義分別為:

1、long offset 為偏移量,正數表示正向偏移(向尾部偏移),負數表示負向偏移(向首部偏移); 

2、int fromwhere 為偏移的起始點,對於fromwhere ,函式fseek定義了三個位置,對應如下:

SEEK_SET(對應 0):檔案開頭;

SEEK_CUR(對應 1):檔案指標所指當前位置;

SEEK_END(對應2):檔案結尾;

FILE *fp;

fseek(fp, 0, SEEK_SET); //!< 指標定位檔案首部

fseek(fp, 100, SEEK_CUR); //!< 指標定位離當前位置100個位元組的地方

fseek(fp, -100, SEEK_END); //!< 指標定位離檔案末尾100個位元組(檔案首部方向)的地方

3、返回值:  如果函式執行成功,FILE *stream將指向以fromwhere 為起始點,偏移offset個位元組的位置,返回返回0。若函式執行失敗(比如offset超過了檔案自身的大小),則不改變stream指向的位置,返回非0值。

若檔案偏移超出了檔案末尾位置,還是返回0,;若往回偏移超出了檔案首部,返回-1,。

函式fread() 的原型是:size_t fread( void *buffer, size_t size, size_t num,FILE *stream)

四個引數的意義可參考fwrite()。稍微不同之處是:fwrite()是將資料從*buffer 寫到 FILE *stream;而fread()是將資料從

FILE *stream寫到*buffer,是一個相反的過程。範例如下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
	FILE *lb;
	char a[] = "Time is fast";
	char b[20];

	if (NULL == (lb = fopen("test.txt", "w+")))   //!<開啟檔案
	{
		printf("Fail to open the file");
		exit(EXIT_FAILURE);
	}

	fwrite( a, sizeof(a), 1, lb);  //!<把a中資料寫入檔案lb
	fseek(lb, 0, SEEK_SET);        //!<把指標lb定位到檔案初始位置
	fread(b, sizeof(a), 1, lb);	   //!<從lb指向的地址開始將一定長度資料寫到b

	printf("a[] = %s\n", a);
	printf("b[] = %s\n", b);
	fclose(lb);

	return ;
}