Как прочитать полный файл, если символ новой строки '0A' является частью файла. - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть файл без символа новой строки.Это непрерывный файл байтового потока.Скажем, весь размер файла составляет 100 КБ.Если n-й килобайт имеет '0A', чтение файла заканчивается этим (проверяется с помощью fseek, даже если я даю n + 10 байт, он останавливается на n-м байте), даже если это не фактический символ новой строки.Я хочу прочитать 100Kb в полном объеме.Как это сделать?

Я использую fgets для чтения файла.

1 Ответ

0 голосов
/ 27 сентября 2018

Покажите свой код.

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

Использовать fread() после выделениябуфер, конечно.

Типичная попытка может быть что-то вроде:

void * load_file(const char *filename, size_t *length)
{
  FILE * const f = fopen(filename, "rb");
  if (f == NULL)
    return NULL;
  void *buf = NULL;
  if (fseek(f, 0, SEEK_END) == 0)
  {
    const long size = ftell(f);
    if (fseek(f, 0, SEEK_SET) == 0)
    {
      if ((buf = malloc(size)) != NULL)
      {
        const size_t got = fread(buf, size, 1, f);
        if (got < size)
        {
          free(buf);
          buf = NULL;
        }
        else if (length != NULL)
          *length = size;
      }
    }
  }
  fclose(f);
  return buf;
}

Выше не проверено, но должно служить достойной схемы.

Вызывающий долженfree() буфер после окончания с ним, конечно.

...