MS и Linux по-разному ожидают окончания строки текстового файла: "\r\n"
против "\n"
.
Чтобы справиться, рекомендуется после fgets()
использовать strcspn()
, чтобы обрезать потенциальный конец последовательности строк, будь то "\n"
, "\r\n"
или отсутствует.
fgets(buf, MAX_LINE_LEN, f_input);
buf[strcspn(buf, "\n\r")] = '\0';
Некоторые компиляторы в Windows будут использовать "\n"
в качестве последовательности конца строки, а другие используют "\r\n"
. Поэтому я приписываю это изменение компиляторам и их производителям больше, чем ОС. Также некоторые старые текстовые MAC-файлы заканчиваются на '\r'
и в Linux будут содержать fgets()
.
Далее: чтение файла с "\r\n"
в виде текстового файла , который ожидает "\n"
в качестве последовательности конца строки, имеет проблему при чтении полного буфера как "......\r"
и остаток строки как "\n"
на следующей fgets()
. Для обработки требуется дополнительная обработка, как в случае, когда буфера недостаточно для строки ввода.
Текстовые файлы одного варианта часто копируются на другие платформы, так что это не редкость.
Из-за редактирования некоторые текстовые файлы будут иметь последовательность последовательностей, заканчивающихся строкой.
Педантичный код будет считывать файл в двоичном виде и обрабатывать окончание строки варианта без fgets()
. Удачи.