Linux系統編程6標準IO - fread和fwrite

實驗1 : fread(buf,size.nmemb,fb) 注意項
實驗2 :以 fread().fwrite() 實現 cp 命令


NAME
fread, fwrite - binary stream input/output,二進制流的輸入和輸出,其實文本流也可以讀。

   #include <stdio.h>

/*
從 FILE *stream 讀
存到 void *pt
一個對象的大小size
nmemb 個對象
讀多少: 讀 nmemb 個 size大小, 一個對象size大小,讀nmemb 個對象
*/
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

/*
從 const void *ptr 讀
寫到 FILE *stream
一個對象的大小size
nmemb 個對象
寫多少: 寫 nmemb 個 size大小, 一個對象size大小,寫nmemb 個對象
*/
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);

RETURN VALUE
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).

fread() does not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred.

返回值是成功的讀寫到的對象的個數、如果讀寫的操作個數小於一個對象 則失敗,返回失敗(短項計數),如果 到達文件末尾,那麼返回0

很多人喜歡用 fread() fwrite(),是因爲在進行成塊的數據操作的時候,就喜歡用這兩個函數,比如 學校的人員管理,假如一個學生的資料佔用100個字節,我需讀寫100個學生的資料,就可以一塊一塊的讀寫,很方便。但是這兩個函數有一個致命缺陷,就是他們不會做邊界的驗證,假如我們在讀寫上述學生信息的時候,讀寫過程中只要有一個字節出錯,會導致整個過程出錯。

實驗1 : fread(buf,size.nmemb,fb) 注意項
假如 buf 大小是10個字節的char型數組,那麼我們有許多中讀法,如下,現有如下兩種情況

第一種情況:fb文件中的數據量足夠

方法1 fread(buf,1.10,fb);//一個對象1個字節,讀10個對象
使用 fread(buf,1.10,fb),即一個對象1個字節,讀10個對象。讀一次
成功即返回10

方法2 fread(buf,10.1,fb) //一個對象10個字節,讀1個對象
使用 fread(buf,10.1,fb) ,即一個對象10個字節,讀1個對象。讀一次
成功即返回1

第二種情況:fb文件中的數據量只有5個字節

情況1 使用 fread(buf,1.10,fb),即一個對象1個字節,讀10個對象。讀一次
會成功讀到5個對象,返回5

情況2 使用 fread(buf,10.1,fb) ,即一個對象10個字節,讀1個對象。讀一次
文件中不夠一個對象,返回0,那麼此時文件中剩餘多少字節呢??

實驗2 :以 fread().fwrite() 實現 cp 命令

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

#define BUFSIZE 5

int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
	FILE *fps = NULL;
	FILE *fpd = NULL;
	char buf[BUFSIZE];
	int n=0;

	if(argc < 3)
	{
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);
	}

	fps = fopen(argv[1],"r");
	if(fps == NULL)
	{
		perror("fopen()");
		exit(1);
	}

	fpd = fopen(argv[2],"w");
	if(fpd == NULL)
	{
		fclose(fps);
		perror("fopen()");
		exit(1);
	}

	while((n = fread(buf,1,BUFSIZE,fps)) > 0)
		fwrite(buf,1,n,fpd);

fclose(fpd);
fclose(fps);
}

注意 如下代碼,

while((n = fread(buf,1,BUFSIZE,fps)) > 0)
	fwrite(buf,1,n,fpd);

一定不能寫成

while((n = fread(buf,1,BUFSIZE,fps)) > 0)
		fwrite(buf,1,BUFSIZE,fpd);

因爲誰也不知道fread 成功讀到了多少個對象,只能先得到讀到的對象數,再以得到的對象數爲準寫到目標流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章