首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ANSI函数获取文本文件的特定行

使用ANSI函数获取文本文件的特定行
EN

Stack Overflow用户
提问于 2019-05-27 04:59:00
回答 1查看 43关注 0票数 0

尝试在c中创建一个函数,该函数可以到达CSV文件中的特定行(类似于getline())。我只被允许使用ANSI 89/99标准。到目前为止,我写了以下内容:

代码语言:javascript
复制
char * getline(FILE * fi,size_t line_length,size_t line_number)
{

size_t i;
char * aux_string;
char * p;
if (fi==NULL)
    return NULL;

if ((aux_string = malloc(line_length*sizeof(char)))==NULL)
    return NULL;

i=0;
while(fgets(aux_string,line_length,fi)!=NULL||feof(fi)!=0)
 {

    if (i==line_number)
    {

        if ((p=strchr(aux_string,'\n'))!=NULL)
        {
            *p='\0';
        }

        return aux_string;  
    }
    i++;

 }
return NULL;
}

只需调用一次getline()就可以正常工作。但是,如果函数的调用方式如下所示:

代码语言:javascript
复制
puts(getline(file_a,MAX_LENGTH,0));
puts(getline(file_a,MAX_LENGTH,0));

它输出紧接在下面的文件中的行,以及所需的行。我怎样才能避免这种情况?这可能是什么原因造成的?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-27 05:04:26

FILE*会记住文件中您结束的位置。因此,第二次调用fread时,文件已经读取了第一行,因此从第二行开始读取。你需要用fseek(fi, 0, SEEK_SET)把文件倒回到开头。

代码语言:javascript
复制
char * getline(FILE * fi,size_t line_length,size_t line_number)
{
    if (fseek(fi, 0, SEEK_SET) != 0) {
          // handle error
     }
     // rest of your function 

备注:

  • rewind等同于fseek(.., 0, SEEK_SET),但不提供错误处理(好吧,除了ferror,is).
  • puts(getline(file_a,MAX_LENGTH,0));会泄漏在getline内部分配的内存。
  • feof(fi)!=0条件从while循环内部看起来是多余的。如果文件没有更多的行,fgets会告诉你。
  • 我建议将函数重命名为某个mygetline或类似的名称,不要混淆其他函数。函数getline已经是一个存在了很长时间的POSIX function
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56317325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档