Читаєте Ви файл у ДВОЙКОМ або в режимі ТЕКСТУ ? У режимі TEXT повернення пари / повернення рядка, CRLF , інтерпретується як TEXT кінець рядка або символ кінця рядка, але в BINARY ви отримуєте лише ОДИН байт за раз, що означає, що будь-який символ ПОВИНЕНбути проігнорованим і залишити в буфері для отримання як іншого байта! Повернення каретки означає на друкарській машинці, що машинка, на якій лежить друкарська рука, досягла правого краю паперу і повертається до лівого краю. Це дуже механічна модель, така як механічна друкарська машинка. Тоді подача рядка означає, що рулон паперу трохи повернутий вгору, щоб папір міг розпочати інший рядок набору тексту. Наскільки я пам’ятаю, одна з низьких цифр в 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);
...
буде найбільш правильним способом обробки всіх типів файлів. Однак зверніть увагу , що \ п в TEXT режим фактично байт пара 0x0d 0x0a, але 0x0d IS просто \ г: \ п включає \ г в TEXT режимі , але не в BINARY , так \ п і \ г \ п еквівалентні ... або має бути. Насправді це дуже основна галузева плутанина, типова галузева інерція, оскільки конвенція полягає в тому, щоб говорити про CRLF на ВСІХ платформах, а потім потрапляти в різні бінарні інтерпретації. Строго кажучи, файли , включаючи ТІЛЬКИ 0x0D (повернення каретки) як \ п (CRLF або рядки), які мають неправильний формат в TEXTрежим (машинка: просто поверніть машину і прочеркніть все ...), і є нелінійним орієнтованим двійковим форматом (або \ r, або \ r \ n, що означає орієнтований на рядок), тому вам не слід читати як текст! Код повинен вийти з ладу, можливо, з якимось повідомленням користувача. Це залежить не тільки від ОС, але також від реалізації бібліотеки C, що додає плутанини та можливих варіацій ... (особливо для прозорих шарів перекладу UNICODE, додаючи ще одну точку артикуляції для заплутаних варіацій).
Проблема попереднього фрагмента коду (механічна друкарська машинка) полягає в тому, що він дуже неефективний, якщо після \ r немає символів \ n (текст автоматичної машинки). Потім він також передбачає режим BINARY, коли бібліотека C змушена ігнорувати інтерпретації тексту (локаль) і видавати просто байти. Не повинно бути різниці між фактичними текстовими символами в обох режимах, лише в контрольних символах, тому, загалом кажучи, читання BINARY краще, ніж режим TEXT . Це рішення є ефективним для BINARYрежим типових текстових файлів ОС Windows, незалежно від варіацій бібліотеки C, і неефективний для інших форматів тексту платформи (включаючи веб-переклади в текст). Якщо ви дбаєте про ефективність, слід скористатися покажчиком функції, провести тест для елементів керування рядками \ r vs \ r \ n, як завгодно, потім вибрати найкращий код користувача getline у покажчику та викликати його з це.
До речі, я пам’ятаю, що теж знайшов деякі текстові файли \ r \ r \ n ... що перекладається у дворядковий текст, як це вимагають деякі споживачі друкованого тексту.