Вы читаете файл в двоичном или в текстовом режиме? В режиме ТЕКСТ пара возврат каретки / перевод строки, CRLF , интерпретируется как ТЕКСТ конца строки или символа конца строки, но в ДВОИЧНОМ вы получаете только ОДИН байт за раз, что означает, что любой символ ДОЛЖЕНигнорироваться и оставляться в буфере для извлечения как другого байта! Возврат каретки в пишущей машинке означает, что тележка пишущей машинки, в которой находится печатающий рычаг, достигла правого края бумаги и возвращается к левому краю. Это очень механическая модель механической пишущей машинки. Тогда перевод строки означает, что рулон бумаги немного повернут вверх, чтобы бумага оказалась в положении, чтобы начать новую строку набора. Насколько я помню, одна из младших цифр в ASCII означает переход на один символ вправо без ввода, мертвый символ и, конечно, \ b означает возврат: переместить автомобиль на один символ назад. Таким образом, вы можете добавлять специальные эффекты, такие как нижний (введите подчеркивание), зачеркивание (введите минус), приблизительные различные акценты, отмените (введите X), без необходимости использования расширенной клавиатуры, просто отрегулировав положение автомобиля вдоль линии перед вводом строки. Таким образом, вы можете использовать напряжение ASCII размером в байты для автоматического управления пишущей машинкой без компьютера. Когда появляется автоматическая пишущая машинка,АВТОМАТИЧЕСКИЙ означает, что как только вы дойдете до самого дальнего края бумаги, вагон вернется влево и будет применен перевод строки, то есть предполагается, что вагон возвращается автоматически по мере продвижения рулона вверх! Таким образом, вам не нужны оба управляющих символа, только один, \ n, новая строка или перевод строки.
Это не имеет ничего общего с программированием, но ASCII старше и ЭЙ! похоже, что некоторые люди не думали, когда начали писать тексты! Платформа UNIX предполагает электрическую автоматическую печатную машину; модель Windows более полная и позволяет управлять механическими машинами, хотя некоторые управляющие символы становятся все менее и менее полезными в компьютерах, например, колокольчик, 0x07, если я хорошо помню ... Некоторые забытые тексты, должно быть, изначально были записаны с помощью управляющих символов для пишущих машинок с электрическим управлением, и это увековечило модель ...
На самом деле правильным вариантом было бы просто включить \ r, перевод строки, без необходимости возврата каретки, то есть автоматический, следовательно:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
будет наиболее правильным способом обработки всех типов файлов. Однако обратите внимание, что \ n в режиме ТЕКСТ на самом деле является парой байтов 0x0d 0x0a, но 0x0d ЕСТЬ просто \ r: \ n включает \ r в режиме ТЕКСТ, но не в ДВОИЧНОМ , поэтому \ n и \ r \ n эквивалентны ... или должно быть. На самом деле это очень простая отраслевая путаница, типичная отраслевая инерция, поскольку принято говорить о CRLF на ВСЕХ платформах, а затем они попадают в различные двоичные интерпретации. Строго говоря, файлы, включающие ТОЛЬКО 0x0d (возврат каретки) как \ n (CRLF или перевод строки), искажаются в ТЕКСТЕ.режим (пишущая машинка: просто верните машину и зачеркните все ...) и представляют собой двоичный формат, не ориентированный на строку (либо \ r, либо \ r \ n, что означает строчную ориентацию), поэтому вы не должны читать как текст! Код должен выйти из строя, возможно, с каким-то пользовательским сообщением. Это зависит не только от ОС, но и от реализации библиотеки C, что усугубляет путаницу и возможные варианты ... (особенно для прозрачных слоев перевода UNICODE, добавляя еще одну точку артикуляции для сбивающих с толку вариантов).
Проблема с предыдущим фрагментом кода (механическая пишущая машинка) заключается в том, что он очень неэффективен, если после \ r (текста автоматической пишущей машинки) нет символов \ n. Затем он также принимает режим BINARY, в котором библиотека C вынуждена игнорировать текстовые интерпретации (языковой стандарт) и отдавать чистые байты. Не должно быть никакой разницы в фактических текстовых символах между обоими режимами, только в управляющих символах, поэтому, вообще говоря, чтение BINARY лучше, чем режим TEXT . Это решение эффективно для BINARYрежим типичных текстовых файлов ОС Windows независимо от вариантов библиотеки C и неэффективен для текстовых форматов других платформ (включая веб-переводы в текст). Если вы заботитесь об эффективности, лучше всего использовать указатель на функцию, протестировать элементы управления строкой \ r vs \ r \ n, как вам нравится, затем выбрать лучший пользовательский код getline в указателе и вызвать его из Это.
Между прочим, я помню, что нашел и несколько текстовых файлов \ r \ r \ n ... которые переводятся в двухстрочный текст, как это все еще требуется некоторым потребителям печатного текста.