打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
从一个文件读取数据
from http://blog.csdn.net/cogbee/article/details/8819882
2013.04

从一个文件读取数据,想必都会。比如举一个简单的例子。下面这个函数,就是从文件读取所有数据,一行一行读取,数据存在des这个数组中:
  1. int getstringfromfile(FILE *fp)  
  2. {  
  3.     char temp[40960] = {0};  
  4.     char ch;  
  5.     int i = 0;  
  6.     int j;  
  7.     while(!feof(fp))  
  8.     {  
  9.         memset(temp,'\0',sizeof(temp));  
  10.         fgets(temp,sizeof(temp),fp);  
  11.         j = 0;  
  12.         ch = temp[j];  
  13.         while(ch != '\0')  
  14.         {  
  15.             des[i++] = ch;  
  16.             j++;  
  17.             ch = temp[j];  
  18.         }  
  19.     }  
  20.     des[i] = '\0';  
  21.     return 0;  
  22. }  

当然如果在一些简单文本中运行,是没有问题的。但是在二进制流文件里面读取就会出问题。这是因为,二进制可能也有’\0‘。这样我们没有读取完就结束了。那怎么办呢?

于是,想到一个文件整块读取。函数如下:

  1. int getstringfromfile(FILE *fp)  
  2. {  
  3.     char *buffer;  
  4.     char ch;  
  5.     int i = 0;  
  6.     long size;  
  7.     size_t result;  
  8.     //obtain file size  
  9.     fseek(fp,0,SEEK_END);  
  10.     size = ftell(fp);  
  11.     rewind(fp);  
  12.   
  13.     //fsize = size;  
  14.     //size = size -1;  
  15.     fsize = size;  
  16.   
  17.     //allocate memory to contain the whole file  
  18.     buffer = (char *)malloc(sizeof(char)*size);  
  19.     if(buffer == NULL)  
  20.     {  
  21.         printf("memory error.");  
  22.         exit(0);  
  23.     }  
  24.     result = fread(buffer,1,size,fp);  
  25.     printf("%d,",result);  
  26.     if(result!=size)  
  27.     {  
  28.         printf("reading error.");  
  29.         exit(0);  
  30.     }  
  31.     fclose(fp);  
  32.     while(i < size)  
  33.     {  
  34.             des[i] = buffer[i];  
  35.             i++;  
  36.     }  
  37.     print(des);  
  38.        free(buffer);  
  39.     return 0;  
  40. }  
这样,以文件大小来确定是否读取结束。这样不存在以上的问题。

同时这个函数给我们一个确定文件大小的方法。

  1. fseek(fp,0,SEEK_END);  
  2. size = ftell(fp);  
因为之前用第一个函数,出现了很多问题。所以网上看了很多,写了第二个函数。在此记录一下。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于fread的问答
C语言函数fread() , fwrite() ,fseek()用法分析
游程编码
C语言程序设计
基于STM32单片机开发光学指纹识别模块(FPM10A)全教程
[LeetCode] 158. Read N Characters Given Read4 II - Call multiple times
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服