Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96883
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-24 22:04
文章分类

全部博文(31)

文章存档

2014年(31)

我的朋友

分类: C/C++

2014-07-23 09:27:26



iniLoadFromFile
    |-----iniInitContext
    |            |-----hash_init_ex
    |                    |-----_has_alloc_buckets
    |-----iniDoLoadFormFile
    |       |-----get_url_content          
    |       |-----getFileContent

    |       |-----iniDoLoadItemsFromBuffer
    |               |-----iniDoloadFromFile
    |               |-----hash_find
    |                       |-----_chain_find_entry
    |               |-----hash_insert
    |                       |-----hash_insert_ex
    |-----iniSortItems
    |        |-----hash_walk



getFileContent:根据文件路径,读取文件数据

点击(此处)折叠或打开

  1. int getFileContent(const char *filename, char **buff, int64_t *file_size)   //filename:完整的文件名,buff:读取数据的缓冲区,file_size:数据的长度,其中buff与file_size从函数中传出
  2. {
  3.     int fd;
  4.     
  5.     fd = open(filename, O_RDONLY);  //以只读方式打开文件
  6.     if (fd < 0)
  7.     {
  8.         *buff = NULL;
  9.         *file_size = 0;  //置为0
  10.         return errno != 0 ? errno : ENOENT;
  11.     }

  12.     if ((*file_size=lseek(fd, 0, SEEK_END)) < 0)//通过lseek的这种方式可以获取文件大小
  13.     {
  14.         *buff = NULL;
  15.         *file_size = 0;
  16.         close(fd);
  17.         return errno != 0 ? errno : EIO;
  18.     }

  19.     *buff = (char *)malloc(*file_size + 1);//分配空间,这里参数传入的必须是char**,分配的空间才能返回,分配比文件长度多一个字节的空间
  20.     if (*buff == NULL)
  21.     {
  22.         *file_size = 0;
  23.         close(fd);

  24.         return errno != 0 ? errno : ENOMEM;
  25.     }

  26.     if (lseek(fd, 0, SEEK_SET) < 0)//通过lseek的这种方式让文件指针回到文件头部
  27.     {
  28.         *buff = NULL;
  29.         *file_size = 0;
  30.         close(fd);
  31.         return errno != 0 ? errno : EIO;
  32.     }
  33.     if (read(fd, *buff, *file_size) != *file_size)//一次性读取整个文件的数据
  34.     {
  35.         free(*buff);
  36.         *buff = NULL;
  37.         *file_size = 0;
  38.         close(fd);
  39.         return errno != 0 ? errno : EIO;
  40.     }

  41.     (*buff)[*file_size] = '\0';//buff的最后一个字符置0
  42.     close(fd);

  43.     return 0;
  44. }
getFileContent函数在函数内部分配了空间,所以调用该函数后,需要在外部释放分配的空间


阅读(1170) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~