1.有時候在使用檔案讀寫時,會遇到要判斷檔案結尾的需求,而C/C++語言在<stdio.h>中有提供一個feof()的函式幫助我們判斷,但是在使用時,請先了解它的使用時機。
下面的寫法模式會發生多讀取的case,而這個原因在於使用feof的時機不對。
FILE* pf; while(!feof(pf)){ //fread 讀取 //資料處理 }feof是發生在fread使用"讀取過檔案"後,已讀到End-of-file位置時,回傳的指標才會是true(檔案結尾) ,所以上面的寫法在讀完最後一筆後,指標會停留在End-of-file位置前,需要再讀一次到在End-of-file位置後(判斷讀取資料失敗,因為已讀到eof),才會為true,而因為fread讀取失敗,buffer的資料不會改變,所以才會多讀一筆.
改善的方式,如先使用fread讀取,再來判斷feof,當feof判斷為true時就跳離loop
while(1){ //fread讀取 if(feof(pf)) break; }
2.C语言求文件长度:
size_t fileSize = 0;
fp = fopen(filename,"rb");//注意这里一定要用二进制方式打开,若用文本方式打开会将“0d0a(回车换行)”当做一个字符
fseek(fp,SEEK_END,0);
fileSize = ftell(fp);
fseek(fp,SEEK_SET,0);//注意这里要把文件指针移动回起始位置
3.使用fread读取文件,判读读取结果应使用ferror进行
/* Attempt to read in 100 bytes: */
count = fread( buffer, sizeof( char ), 100, stream );
if( ferror( stream ) ) {
perror( "Read error" ); //perror用于打印错误信息
break;
}
4.C语言求文件长度的另一种方法:
struct stat buf;
int result;
FILE *fp;
/* Get the size of the file */
fp = fopen (fileName, "r"); //不需要指定二进制方式打开
if (fp == NULL)
{
return;
}
result = fstat (fileno (fp), &buf); //注意使用fstat(获取文件信息)与fileno(获取文件句柄)
if (result != 0) //fstat执行成功则返回0,失败返回-1
{
fclose (fp);
return;
}
/* Allocate a buffer and read all into memory */
fileSize = buf.st_size; //得到文件长度