Получение к определенным строкам текстового файла с использованием функций ANSI - PullRequest
0 голосов
/ 26 мая 2019

при попытке создать функцию в 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 Ответ

2 голосов
/ 27 мая 2019

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 , которая существует очень долго.
...