刚刚完成的C读取文件一行数据,可以读大量数据的行。
/*
函数功能:
读取文件的一行,当开辟内存不够时return值为-1,size会给出至少需要的内存大小,
return值为1时表示此时文件结束,从buffer,size得到最后一行的数据和大小。
输入参数:
stream:文件流
size:buffer大小,开辟内存大小
输出参数:
buffer:存放一行字符
size:buffer大小,字符数目
返回值:
-1:读取发生错误
0:成功读取
1: 文件结束
备注:
2010.01.11
*/
int rtFGetLine(FILE *stream,char *buffer,int &size)
{
static unsigned long offset = 0;
bool fileend = 0;
unsigned long bufsize = 1024;
char *buf = NULL, *dest = NULL;
unsigned short inc = 1;
if(!stream || !buffer)
{
return -1;
}
while(1)
{
bufsize *= inc;
buf = (char *)malloc(sizeof(char)*bufsize);
if(NULL == buf)
{
return -1;
}
memset(buf,0x00,bufsize);
fseek(stream,offset,SEEK_SET);
fread(buf,sizeof(char),bufsize,stream);
if(ferror(stream))
{
return -1;
}
dest = strchr(buf,'/n');
if(NULL == dest)
{
if( strlen(buf) >= bufsize - 1 )//该行字符大于bufsize
{
inc++;
free(buf);
buf = NULL;
continue;
}
if(feof(stream))//文件包含结束标志
{
offset += strlen(buf) + 2;
fileend = 1;
break;
}
}
fileend = 0;
*(buf + (dest - buf))=0x00;
offset += dest - buf + 2;
break;
}
if(strlen(buf) < size)
{
memset(buffer,0x00,strlen(buffer));
strcpy(buffer,buf);
size = strlen(buf);
free(buf);
buf = NULL;
return mvb_end;
}
//存储空间不够
size = strlen(buf);
free(buf);
buf = NULL;
return -1;
}