在尝试创建一个函数在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));
它输出文件中的行紧接着下面,以及所需的行.我如何才能避免这种情况?什么可能导致这种情况?谢谢.
1条答案
按热度按时间3duebb1j1#
FILE*
会记住你在文件中结束的位置。所以当你第二次调用fread
时,文件已经读到了第一行,所以你要从第二行开始阅读。你需要fseek(fi, 0, SEEK_SET)
将文件倒回开头。备注:
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。