尝试在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));
它输出紧接在下面的文件中的行,以及所需的行。我怎样才能避免这种情况?这可能是什么原因造成的?谢谢。
发布于 2019-05-27 05:04:26
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
备注:
fseek(.., 0, SEEK_SET)
,但不提供错误处理(好吧,除了ferror
,is).puts(getline(file_a,MAX_LENGTH,0));
会泄漏在getline
内部分配的内存。feof(fi)!=0
条件从while
循环内部看起来是多余的。如果文件没有更多的行,fgets
会告诉你。mygetline
或类似的名称,不要混淆其他函数。函数getline
已经是一个存在了很长时间的POSIX function。https://stackoverflow.com/questions/56317325
复制相似问题