c- читать в строке из файла - PullRequest
       1

c- читать в строке из файла

0 голосов
/ 07 февраля 2011

Я новичок в c, но я хотел бы прочитать текст из файла. Я не знаю длину первой строки файла, так как я могу написать правильные параметры для функции fgets? Прямо сейчас у меня есть:

char read[30]; // but I really don't know how long the line will be

while(fgets(read, sizeof(read), fp).......

Ответы [ 6 ]

1 голос
/ 07 февраля 2011

Вам нужно будет просто перераспределять и добавлять в буфер, пока не дойдете до конца строки. Код не очень красивый, но нет простой альтернативы, использующей стандартную библиотеку C:

char read[30];
char *line;
int len, total;

line = NULL;
total = 0;

do {
  if (fgets(read, sizeof(read), fp) == NULL)
    break;

  len = strlen(read);

  if (total == 0) {
    total = len;
    line = (char *)malloc(len);
    strcpy(line, read);
  } else {
    total += len;
    line = (char *)realloc(line, total);
    strcat(line, read);
  }
} while (read[len - 1] != '\n');
0 голосов
/ 08 февраля 2011

Если вы не знаете свой макс. Вы можете читать char по символам и использовать realloc, тогда это просто:

char *read = calloc(1,1),c;

while( c=fgetc(fp), !feof(fp) )
  if( c=='\n' )
  {
    puts(read);
    *read=0;
  }
  else
  {
    read = realloc(read,strlen(read)+2);
    read[strlen(read)+1]=0;
    strncat(read,&c,1);
  }
fclose(fp);
if( *read )
  puts(read);
free(read);
0 голосов
/ 07 февраля 2011

У вас есть (как минимум) два варианта. Безусловно, наиболее распространенным является выделение буфера, который предполагается «достаточно большим» (например, несколько килобайт), и просто использование его (и, возможно, неправильное поведение, если он предоставляется с данными, которые не соответствуют этому ограничению).

Основной альтернативой является динамическое выделение памяти для буфера, и если / если эти данные не подходят, используйте realloc, чтобы увеличить размер буфера и прочитать еще немного.

0 голосов
/ 07 февраля 2011

В вашем fgets отключено по одному ().Если ваш буфер имеет размер 30, вам нужно использовать sizeof (read) +1.Как сказал Феличе, вам нужно установить безопасный максимум.

0 голосов
/ 07 февраля 2011

Используя стандартную библиотеку C, вы просто должны принять максимальный размер строки и продолжить. Если вы обнаружите, что read не заканчивается новой строкой, вы можете прочитать больше и добавлять дополнительные данные, пока не найдете конец строки. Однако для большинства приложений, где fgets() является приемлемым для синтаксического анализа, также допустима фиксированная длина строки.

0 голосов
/ 07 февраля 2011

Вы должны установить безопасную разумную максимальную длину для линии и использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...