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