免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6203 | 回复: 13
打印 上一主题 下一主题

写了一个函数用于读取文本文件行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-09 20:38 |只看该作者 |倒序浏览
当然,我不属于高手,都有4年没有写C了,所以,对C很陌生了,最近写了一个函数用来读取给定文件指针所指向文件的内容,当然是文本文件,然后用来读取没行文本,然后返回这个行的指针,当然,这里我用到的是动态大小建立在堆上面,所以,在使用的时候一定要用free作释放,不然会有内存泄露。把程序代码贴出来,显献丑,各位高手,斑竹,尽量执教批评,哈哈。只要不骂我就行。

char* freadline(FILE *fp){
        size_t line_length=0;
        size_t result;
        char ch;
        char *line_content;
        int stop_mark_positoin=0;
        while((result=fread(&ch,sizeof(char),1,fp))==1)
        {

                if(ch!='\n' && ch!='\r')
                {
                        line_length+=result;
                        continue;
                }
                if(ch=='\r')
                {
                        line_length+=result;
                        stop_mark_positoin++;
                        continue;
                }
                if(ch=='\n')
                {
                        stop_mark_positoin++;
                        line_length+=1;
                        line_content=(char *)malloc(sizeof(char)*line_length);

                        fseek(fp,-line_length,SEEK_CUR);
                        fread(line_content,sizeof(char),line_length,fp);
                        line_content[line_length-stop_mark_positoin]='\0';
                        line_length=0;
                        stop_mark_positoin=0;
                        return line_content;
                }
        }

        if(line_length>0)
        {
                line_content=(char *)malloc(sizeof(char)*line_length+1);
                fseek(fp,-line_length,SEEK_CUR);
                fread(line_content,sizeof(char),line_length,fp);
                line_content[line_length]='\0';
                return line_content;
        }
        return NULL;
}

[ 本帖最后由 lonelybugkv 于 2009-4-9 21:04 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-09 21:03 |只看该作者
其实可以用fgets的

论坛徽章:
0
3 [报告]
发表于 2009-04-09 21:07 |只看该作者
哦,我知道的,但是我现在坐的是基因分析,所以,很多时候基因串每行大小都不固定,主要是,我不能确定最长的长度,我碰见过有最长可以达到500k的。

所以,我就用这个来进行读取行,也不用具体确定fgets时候的长度。

论坛徽章:
0
4 [报告]
发表于 2009-04-09 22:32 |只看该作者
一直认为, 分配内存应该尽量保持和释放内存在相同的level里。
即一个函数如果分配了内存那么它就应该负责释放它。
或者分配和回收都放到这个函数的外部。。。

论坛徽章:
0
5 [报告]
发表于 2009-04-09 22:51 |只看该作者
据说基因分析喜欢用一种叫 P 什么的语言,文本操作非常方便

论坛徽章:
0
6 [报告]
发表于 2009-04-09 23:28 |只看该作者
lz考虑内存池方案吧,比频繁的alloc free好很多

论坛徽章:
0
7 [报告]
发表于 2009-04-10 00:18 |只看该作者
也有用GPU来搞生物计算的。

PS: 真是拿着锤子,看啥都是钉子。

论坛徽章:
0
8 [报告]
发表于 2009-04-10 00:28 |只看该作者
原帖由 scutan 于 2009-4-10 00:18 发表
也有用GPU来搞生物计算的。

PS: 真是拿着锤子,看啥都是钉子。


很适合的,这种大量计算任务。

论坛徽章:
0
9 [报告]
发表于 2009-04-10 08:49 |只看该作者

基因

听起来很神奇。。。

论坛徽章:
0
10 [报告]
发表于 2009-04-10 12:10 |只看该作者
原帖由 DQP 于 2009-4-9 22:32 发表
一直认为, 分配内存应该尽量保持和释放内存在相同的level里。
即一个函数如果分配了内存那么它就应该负责释放它。
或者分配和回收都放到这个函数的外部。。。



我也知道这个准则,我有一点不太明白的是,我看到openssl或者socket程序里面会有一个函数open或者create一个结构,然后由另一个函数进行释放和关闭。

这样的话,我可不可以用一个函数freadline来读取一个line,然后再用一个函数(在同一个.c文件中)进行free这个line。

我不太清楚,这样算是在一个level么?我也使新手写C,之前一直java,所以,很多理念需要学习,希望高手过给我几招,哈哈。


谢谢了先。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP