при попытке создать функцию в 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));
Выводит строку в файле сразу ниже, а также нужную строку. Как я могу этого избежать? Что может быть причиной этого? Спасибо.





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), но не предлагает обработки ошибок (weii, кроме ferror).puts(getline(file_a,MAX_LENGTH,0)); утечка памяти, выделенной внутри getline. Вы должны char *pnt = getline(...); puts(pnt); free(pnt) всегда помнить о том, чтобы выбрасывать мусор.feof(fi)!=0 внутри цикла while выглядит избыточным. Если в файле больше нет строк, fgets сообщит вам об этом.mygetline или вроде того, чтобы не путать других. Функция getline уже является POSIX-функция, которая существует уже очень давно.
Избавьтесь от
feof(fi)!=0состояния