| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1587 人关注过本帖
标题:从不定长文本中读取整行,输出最后会多出一个空行问题
只看楼主 加入收藏
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
从不定长文本中读取整行,输出最后会多出一个空行问题
如何避免输出最后的空行

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

char *readLine(FILE *file){
    if(file == NULL){
        exit(1);
    }
    /* malloc linebuffer */
    int baseLen = 256;  // 初始长度设置256字符
    char *lineBuf = (char *)malloc(sizeof(char) * baseLen);
    if(lineBuf == NULL){
        exit(1);
    }

    int ch,index=0;
    while((ch=fgetc(file)) != 10 && ch != EOF){ // ASCII 10 => "\n"
        lineBuf[index] = ch;
        index++;

        if(index == baseLen){
            baseLen += 256;
            lineBuf = (char *)realloc(lineBuf, baseLen); // 内存不足时每次再重新分配256字符空间
            if(lineBuf == NULL){
                exit(1);
            }
        }
    }
    lineBuf[index] = '\0'; // end of string add '\0'

    return lineBuf;
}

int main(int argc, char *argv[])
{
    FILE *fp = fopen(argv[1],"r");
    if(fp == NULL){
        exit(1);
    }
    while(!feof(fp)){
        char *line = readLine(fp);
        printf("%s\n",line);
    }
    exit(0);
}
搜索更多相关主题的帖子: exit char NULL FILE index 
2020-11-09 08:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
输出最后会多出一个空行问题

一般看到这种问题,我都会直接搜索 feof,果然出现了 while(!feof(fp)) 。
我一直非常好求,这种错误用法是如何流传得如此广泛的。
2020-11-09 09:04
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
收藏
得分:0 
回复 2楼 rjsp
我就是不懂才来学习的,那么请给出正确用法吧,谢谢
2020-11-09 09:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readline( FILE* file )
{
    const size_t baselen = 256;
    char* line = NULL;
    size_t size = 0;
    size_t capacity = 0;

    for( ; ; )
    {
        if( capacity <= size+1 )
        {
            capacity += baselen;
            char* t = realloc( line, capacity );
            if( !t )
            {
                free( line );
                return NULL;
            }
            line = t;
        }

        {
            char* t = fgets( line+size, capacity-size, file );
            if( t == NULL )
            {
                if( ferror(file) )
                {
                    free( line );
                    return NULL;
                }
                return size!=0 ? line : NULL;
            }
        }

        {
            size_t t = strlen( line+size );
            if( t!=0 && line[size+t-1]=='\n' )
            {
                line[size+t-1] = '\0';
                break;
            }
            size += t;
        }
    }

    return line;
}

int main( void )
{
    FILE* fp = fopen( "d:/test.txt", "r" );
    for( char* line; line=readline(fp), line; )
    {
        puts( line );
        free( line );
    }
}
2020-11-09 11:17
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
收藏
得分:0 
回复 4楼 rjsp
gcc 4.4.7 Segmentation fault

[此贴子已经被作者于2020-11-9 13:21编辑过]

2020-11-09 13:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 5楼 size_t
对于 FILE* fp = fopen( "d:/test.txt", "r" ); 你不会改都没改吧?!
2020-11-09 13:27
size_t
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-6-5
收藏
得分:0 
回复 6楼 rjsp
找到问题了,直接运行没给文件的问题

[此贴子已经被作者于2020-11-9 14:14编辑过]

2020-11-09 14:13
快速回复:从不定长文本中读取整行,输出最后会多出一个空行问题
数据加载中...
 
   



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

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