| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1492 人关注过本帖
标题:gzgets 读取问题
只看楼主 加入收藏
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:3 
gzgets 读取问题
代码如下:输出结果只有最后的部分,没明白哪里出了问题,求教

程序代码:
#include <zlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

char *getlines(gzFile file)
{
        size_t baselen = 10;
        char *line = (char *)malloc(baselen * sizeof(char));
        if(!line) exit(1);

        while(gzgets(file,line,baselen)!=NULL)
        {
                if(strstr(line,"\n"))   // 判断读入的内容时候含有换行符,此处有'\n',表明完整的读完一行。
                {
                        line[strlen(line)-1]='\0';
                        return line;
                }
                else         // 没有读入换行符,只读入了一行的一部分; 此时重新分配内存,再次用gzgets读取, 直到读到换行符为止。                             
                {
                        do
                        {
                                baselen += 10;
                                line = (char *)realloc(line,baselen);
                                if(!line) exit(1);
                                gzgets(file,line,baselen);
                        }while(strstr(line,"\n")==NULL);

                        line[strlen(line)-1]='\0';
                        return line;
                }
        }
        line[strlen(line)-1]='\0';
        return line;
}

int main(int argc, char *argv[])
{
        gzFile fp=gzopen(argv[1],"r");
        if(!fp) exit(1);
        int cot =0;
        char *line;
        while((line=getlines(fp))!=NULL && !gzeof(fp)) 
        { 
                cot++; 
                printf("line %d\t%s\n",cot,line);
                free(line); 
        }
        gzclose(fp);
        exit(0);
}


搜索更多相关主题的帖子: 读取 exit char line include 
2021-05-25 17:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
    do
    {
            baselen += 10;
            line = (char *)realloc(line,baselen);
            if(!line) exit(1);
            fgets(line,baselen,file);
    }while(strstr(line,"\n")==NULL);
红色的那句,不就将原先的数据给覆盖了嘛!
2021-05-26 09:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:30 
猜测你的需求,我重写了一个

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct SHIT_FILE_ {
    FILE* file;
    char* line;
    int capacity;
} SHIT_FILE;

SHIT_FILE shit_open( const char* filename )
{
    return (SHIT_FILE){ fopen(filename,"rt"), NULL, 0 };
}

void shit_close( SHIT_FILE* pfile )
{
    if( pfile && pfile->file )
    {
        free( pfile->line );
        fclose( pfile->file );
        pfile->file = NULL;
        pfile->line = NULL;
        pfile->capacity = 0;
    }
}

char* shit_getline( SHIT_FILE* pfile )
{
    const int growth = 10;
    for( int offset=0; ; )
    {
        if( offset!=0 || pfile->capacity==0 )
        {
            char* tmp = realloc( pfile->line, pfile->capacity+growth );
            if( !tmp ) return NULL;
            pfile->line = tmp;
            pfile->capacity += growth;
        }

        if( fgets(pfile->line+offset,pfile->capacity-offset,pfile->file) )
        {
            size_t n = strlen( pfile->line+offset );
            if( pfile->line[offset+n-1] == '\n' )
            {
                pfile->line[offset+n-1] = '\0';
                return pfile->line;
            }
            offset += n;
        }
        else if( feof(pfile->file) )
            return offset!=0 ? pfile->line : NULL;
        else
            return NULL;
    }
    return NULL;
}

int main( int argc, char* argv[] )
{
    if( argc <= 1 )
        return 1;
    SHIT_FILE fp = shit_open( argv[1] );
    if( !fp.file ) return 1;

    size_t cot = 0;
    for( char* line; line=shit_getline(&fp), line; )
        printf( "line %zu: %s\n", ++cot, line );

    shit_close( &fp );
}
2021-05-26 10:27
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
收藏
得分:0 
回复 3楼 rjsp
谢谢,我先研究下
2021-05-26 18:15
快速回复:gzgets 读取问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043771 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved