从一个文件读取数据,想必都会。比如举一个简单的例子。下面这个函数,就是从文件读取所有数据,一行一行读取,数据存在des这个数组中:
int getstringfromfile(FILE *fp)
{
char temp[40960] = {0};
char ch;
int i = 0;
int j;
while(!feof(fp))
{
memset(temp,'\0',sizeof(temp));
fgets(temp,sizeof(temp),fp);
j = 0;
ch = temp[j];
while(ch != '\0')
{
des[i++] = ch;
j++;
ch = temp[j];
}
}
des[i] = '\0';
return 0;
}
当然如果在一些简单文本中运行,是没有问题的。但是在二进制流文件里面读取就会出问题。这是因为,二进制可能也有’\0‘。这样我们没有读取完就结束了。那怎么办呢?
于是,想到一个文件整块读取。函数如下:
int getstringfromfile(FILE *fp)
{
char *buffer;
char ch;
int i = 0;
long size;
size_t result;
//obtain file size
fseek(fp,0,SEEK_END);
size = ftell(fp);
rewind(fp);
//fsize = size;
//size = size -1;
fsize = size;
//allocate memory to contain the whole file
buffer = (char *)malloc(sizeof(char)*size);
if(buffer == NULL)
{
printf("memory error.");
exit(0);
}
result = fread(buffer,1,size,fp);
printf("%d,",result);
if(result!=size)
{
printf("reading error.");
exit(0);
}
fclose(fp);
while(i < size)
{
des[i] = buffer[i];
i++;
}
print(des);
free(buffer);
return 0;
}
这样,以文件大小来确定是否读取结束。这样不存在以上的问题。
同时这个函数给我们一个确定文件大小的方法。
fseek(fp,0,SEEK_END);
size = ftell(fp);
因为之前用第一个函数,出现了很多问题。所以网上看了很多,写了第二个函数。在此记录一下。