для обработки ВСЕХ 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 случая, некоторые из которых могут не соответствовать ожидаемому системно-зависимому окончанию строки.