Обработка CRLF, CR и LF при чтении текстового файла - PullRequest
1 голос
/ 15 марта 2019

У меня есть часть C-кода, как показано ниже, которая соблюдается в среде Linux GCC.

В моем проекте мне приходится обрабатывать ВСЕ CRLF, CR и LF при чтении TXT-файла, созданного из разных ОС.

Я не уверен, что fscanf () обрабатывает все случаи автоматически.

Есть ли другой способ, который может обрабатывать все случаи?

while (fscanf(fp, "%d", &data) != EOF) 
{
    printf("%d\n", data);
}

1 Ответ

1 голос
/ 15 марта 2019

для обработки ВСЕХ CRLF, CR и LF при чтении текстового файла, созданного из разных ОС.

Я не уверен, обрабатывает ли fscanf() все случаи автоматически.

Некоторое использование fscanf() будет работать нормально, как fscanf(fp, "%d", &data), но не все.

Простая альтернатива - прочитать строки ввода с вашим собственным my_fgets(), изатем вызовите sscanf().

char my_fgets(char *s, size_t sz, FILE *fp) {
  if (sz < 1) {
    return NULL;
  }
  char *org = s;
  bool no_input = true;
  int ch = 0;

  while (--sz > 0 && (ch = fgetc(fp)) != EOF) { 
    no_input = false; 
    if (ch == '\r') {
      int ch2 = fgetc(fp);
      if (ch2 != '\n') ungetc(ch2, fp);
      break;
    }
    if (ch == '\n') {
      break;
    }
    *s++ = ch;
  }
  *s = '\0';
  if ((ch == EOF) && (no_input || !feof(fp))) return NULL;
  return org;
} 

my_fgets(buffer, sizeof buffer, fp);
sscanf(buffer, ...);

Это будет работать в большинстве случаев, если файл будет открыт в двоичном или текстовом режиме.


Опираясь на текстовый режим и системно-зависимую строку-завершения перевода недостаточно, поскольку код должен обрабатывать как минимум 3 случая, некоторые из которых могут не соответствовать ожидаемому системно-зависимому окончанию строки.

...