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

Getting to specific lines of a text file using ANSI functions

试图在 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='[=10=]';
        }

        return aux_string;  
    }
    i++;

 }
return NULL;
}

这对于单次调用 getline() 来说工作得很好。但是,如果像下面的示例那样调用该函数:

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

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

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),但不提供错误处理(weii,除了 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