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

r7s23pms  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(106)

在尝试创建一个函数在c可以得到一个特定的行在一个CSV文件(类似getline()).我只允许使用ANSI 89/99标准.这是我写的到目前为止:

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()的单次调用来说,这是相当不错的,但是,如果像下面的例子那样调用函数:

puts(getline(file_a,MAX_LENGTH,0));
puts(getline(file_a,MAX_LENGTH,0));

它输出文件中的行紧接着下面,以及所需的行.我如何才能避免这种情况?什么可能导致这种情况?谢谢.

3duebb1j

3duebb1j1#

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

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)。
  • puts(getline(file_a,MAX_LENGTH,0));泄漏了分配在getline内部的内存。您应该始终记住char *pnt = getline(...); puts(pnt); free(pnt)将垃圾箱拣出来。
  • while循环中的feof(fi)!=0条件看起来是多余的。如果文件没有更多的行,fgets会告诉您。
  • 我建议将函数重命名为mygetline之类的,不要混淆其他人。函数getline已经是一个存在很久的POSIX function

相关问题