Чтение файла с использованием fgetc дает дополнительные (мусорные) значения - PullRequest
0 голосов
/ 25 февраля 2019

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

Я заметил, что переменная line_size (см. Ссылку ниже) выходит за пределы фактического размера строки, т.е. значение line_size равно 106, тогда как фактическая длина моегострока состоит из 103 символов.

Итак, для отладки я добавил оператор печати, который соответствовал каждому прочитанному символу текущему размеру буфера: printf("%c\t%i\n",c,current_buffer_size);

Как только я запустил программу, оказалось, что fgetc читает некоторые «мусорные» символы (см. Скриншот ниже).

(ссылка: char * line сохраняет данные из буфера, intline_size отслеживает размер символа * line)

Примечание : значение FILE_BUFFER равно 128

enter image description here

char *readline(FILE *fptr)
{
  char buffer[FILE_BUFFER];
  char *line = malloc(sizeof(char));
  int current_buffer_size, line_size = 0;
  int c;
  int is_reading = 1;

  while(is_reading)
  {
    current_buffer_size = 0;
    while(current_buffer_size < FILE_BUFFER)
    {
      c = fgetc(fptr);
      if ( c == '\n' || feof(fptr))
      {
        is_reading = 0;
        break;
      }
      buffer[current_buffer_size] = c;
      current_buffer_size += 1;
      printf("%c\t%i\n",c,current_buffer_size);
    }
    line_size += current_buffer_size;
    line = (char *) realloc(line,line_size*sizeof(char));
    memcpy(&line[line_size-current_buffer_size], buffer, current_buffer_size);
  }
  if (line_size == 0) return NULL;
  line = (char *) realloc(line,(line_size+1)*sizeof(char));
  line[line_size] = 0;
  printf("\n%i\n",line_size); // final size of the line
  return line;
}

В чем может быть причина этого?

1 Ответ

0 голосов
/ 25 февраля 2019

Спасибо всем за полезные комментарии.Выдача была решена благодаря @JonathanLeffler и @ dasblinkenlight

Таким образом, проблема заключалась в том, что некоторые символы в файле выпадали из однобайтового диапазона UTF-8 (0-127).Поскольку мой текстовый редактор и терминал работают в этом режиме UTF-8, эти символы не отображались.Бинарный дамп каждого символа (с использованием xxd -b -c2 file.txt) выявил эту проблему.(Полное раскрытие: текстовый файл был экспортирован из WhatsApp).

Дамп памяти , показывающий символы вне диапазона (слева) и «значения мусора» (справа) enter image description here enter image description here

(три символа: 11100010 10000000 10001110 вызывали проблемы)

Это будеттакже объясните другие, казалось бы, необъяснимые ошибки памяти, которые выдает приложение из-за «дополнительного подсчета» символов.Многое имеет смысл сейчас.

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