C++ 文件流處理

包含於#include<stdio.h> 的FILE 類:fread和feof

// 讀取文件塊數據
size_t fread(void *buffer, size_t size, size_t count, FILE *file);

fread參數說明:buffer是讀取數據後存放地址,size是的塊長度,count是塊的數量,實際讀取長度爲size*count,返回值爲塊成功讀取塊的count數量。

//判斷上次讀操作是否遇到文件末尾
int feof(FILE *stream);

feof返回0表示文件沒有結束,返回1,表示結束。
feof實際觀察的是上次讀操作的內容,也就是上次讀操作fread返回的值,如果讀操作的返回值表明讀取的不是空,那feof就返回0,如果上次讀操作失敗了,則feof返回1,表示讀取完了。

在VC裏,只有當文件位置指針(fp->_ptr)到了文件末尾,然後再發生讀/寫操作時,標誌位(fp->_flag)纔會被置爲含有_IOEOF。然後再調用feof(),纔會得到文件結束的信息。注意這裏feof判斷的是上一次讀操作移動的FILE指針是否遇到文件末尾,因此,如果運行如下程序:

char c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%X/n", c); 
}

會發現多輸出了一個FF,原因就是在讀完最後一個字符後,fp->flag仍然沒有被置爲_IOEOF,因而feof()仍然沒有探測到文件結尾。直到再次調用fgetc()執行讀操作,feof()才能探測到文件結尾。這樣就多輸出了一個-1(即FF)。正確的寫法應該是:

char c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X/n", c); 
c = fgetc(fp);
} 

看到這個問題後去翻了翻自己以前寫的利用socket發送圖片的代碼,看有沒有犯類似錯誤,發現採用的是另一種方法:

UINT nSize = 0;
UINT nSend = 0;
char *szBuff = NULL;
//發送
while (nSize < FindFileData.nFileSizeLow)
{
	szBuff = new char[10240];
	memset(szBuff, 0x00, 10240);
	nSend = file.Read(szBuff, 10240);
	fwqClientsock.Send(szBuff, nSend);//發送數據
	nSize += nSend;
}
	file.Close();
	delete szBuff;

沒有判斷文件結尾標誌而是判斷已讀大小。

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