from http://blog.csdn.net/cogbee/article/details/8819882 2013.04
从一个文件读取数据,想必都会。比如举一个简单的例子。下面这个函数,就是从文件读取所有数据,一行一行读取,数据存在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);
因为之前用第一个函数,出现了很多问题。所以网上看了很多,写了第二个函数。在此记录一下。
|