Принудительно C прекратить интерпретацию символов новой строки, отличных от CR LF - PullRequest
2 голосов
/ 03 апреля 2020

Моя программа читает текстовый файл Windows построчно, используя fgets с MinGW. Каждая строка заканчивается CR LF ('\r', '\n'). Текстовый файл генерируется инструментами и иногда содержит символ '\n' в данных.

Я обнаружил, что fgets игнорирует каждый символ после '\n' и часть моих данных отсутствует.

Как изменить это поведение, чтобы:

  • Одиночный '\n' обрабатывался как обычный символ
  • '\r' '\n' обрабатывался как новая строка

Редактировать: Я обнаружил, что некоторые строки в двойных кавычках в моем файле имеют '\n' в данных, но также имеют '\r' '\n' в данных иногда. К сожалению, я не могу починить инструменты. Поэтому мне пришлось написать некоторый код, как это предлагается в ценных комментариях.

1 Ответ

0 голосов
/ 16 апреля 2020

Как предлагается в комментариях, я разместил здесь код, который написал для решения проблемы. Код, вероятно, содержит ошибки, размещены ниже в качестве ссылки:

static void DIRTY_ReadLine (FILE     *File,
                            uint8_t  *Buffer,
                            uint32_t  BufferSizeInBytes)
{
  uint8_t  *pChar = Buffer;
  uint32_t  ByteCount;
  int32_t   Character;
  int32_t   PreviousCharacter;
  bool      NewLineFound;
  bool      InsideString;

  Character         = fgetc(File);
  PreviousCharacter = 0;
  NewLineFound      = false;
  InsideString      = false;
  ByteCount         = 0;

  while (!NewLineFound
         && (Character != EOF)
         && (ByteCount < BufferSizeInBytes))
  {
    if (!InsideString
        && (PreviousCharacter == '\r')
        && (Character == '\n'))
    {
      pChar--;
      *pChar       = '\0';
      NewLineFound = true;
    }
    else
    {
      if (Character == '\"')
      {
        InsideString = !InsideString;
      }      
      *pChar            = (uint8_t)Character;
      PreviousCharacter = (uint8_t)Character;
      pChar++;
      ByteCount++;
      Character = fgetc(File);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...