1. feof
Return Value
The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.
第一次尝试读文件尾后面的数据时返回非零值。因此,常会使用!feof(file)做为循环读文件是否到尾部的判断,而当feof(file)为非零值时,已经对文件尾部后面的数据进行过一次尝试读取,读取的值不可预期,这些值是无用的,应舍弃。
下面的代码
错误用法:
int k = 0;
while( !feof( file ) )
{
nPos = GetChnPosition(m_nChn,k);
if(fseek(file,nPos,SEEK_SET)) break;
fread(pData,sizeof(float),m_nCol,file);
///*注释掉这句代码*/if(feof(file)) break;/**///这一句千万不能省去,否则最后一次读取的无用数据将会写到文件f中,切记!!!
k++;
for(int j = 0; j < m_nCol; j++)
fprintf(f,"%f/t",pData[j]);//最后一次读取的无用数据写到文件f中,逻辑上出错
}
正确用法:
int k = 0;
while( !feof( file ) )
{
nPos = GetChnPosition(m_nChn,k);
if(fseek(file,nPos,SEEK_SET)) break;
fread(pData,sizeof(float),m_nCol,file);
if(feof(file)) break;/**///这一句千万不能省去,否则最后一次读取的无用数据将会写到文件f中,切记!!!
k++;
for(int j = 0; j < m_nCol; j++)
fprintf(f,"%f/t",pData[j]);
}
或者改写成这种形式:
int k = 0;
int nPos = GetChnPosition(m_nChn,k++);
if(fseek(file,nPos,SEEK_SET)) break;
fread(pData,sizeof(float),m_nCol,file);
while( !feof( file ) )
{
for(int j = 0; j < m_nCol; j++)
fprintf(f,"%f/t",pData[j]);
nPos = GetChnPosition(m_nChn,k++);
if(fseek(file,nPos,SEEK_SET)) break;
fread(pData,sizeof(float),m_nCol,file);
}