Czy czytasz plik w trybie BINARNY czy TEKSTOWY ? W TEKSTU trybie pasza powrót / linia przewóz pary, CRLF , jest interpretowana jako TEKST końca linii lub znaku końca linii, ale w BINARY Ci pobrać tylko JEDEN bajt na raz, co oznacza, że zarówno charakter koniecznościąbyć ignorowane i pozostawione w buforze do pobrania jako kolejny bajt! Powrót karetki oznacza w maszynie do pisania, że wózek maszyny do pisania, w którym leży ramię drukujące, osiągnął prawą krawędź papieru i powrócił do lewej krawędzi. To bardzo mechaniczny model mechanicznej maszyny do pisania. Wówczas wysunięcie wiersza oznacza, że rolka papieru jest nieco obrócona do góry, aby papier mógł rozpocząć kolejny wiersz pisania. O ile pamiętam jedna z małych cyfr w ASCII oznacza przesunięcie w prawo o jeden znak bez wpisywania, martwy znak i oczywiście \ b oznacza cofnięcie: cofnij samochód o jeden znak. W ten sposób możesz dodać efekty specjalne, takie jak podkład (typ podkreślenia), przekreślenie (typ minus), przybliżone różne akcenty, anulowanie (typ X), bez konieczności korzystania z rozszerzonej klawiatury, po prostu dostosowując położenie samochodu wzdłuż linii przed wejściem do linii zasilającej. Możesz więc używać napięć ASCII wielkości bajtów do automatycznego sterowania maszyną do pisania bez komputera pomiędzy nimi. Po wprowadzeniu automatycznej maszyny do pisaniaAUTOMATYCZNY oznacza, że po osiągnięciu najdalszej krawędzi papieru samochód jest cofany w lewo ORAZ zastosowany wysuw linii, czyli zakłada się, że samochód jest automatycznie cofany, gdy rolka przesuwa się do góry! Więc nie potrzebujesz obu znaków sterujących, tylko jeden, \ n, nowy wiersz lub nowy wiersz.
Nie ma to nic wspólnego z programowaniem, ale ASCII jest starszy i HEJ! wygląda na to, że niektórzy ludzie nie myśleli, kiedy zaczęli pisać tekst! Platforma UNIX zakłada automatyczną maszynę elektryczną; model Windows jest bardziej kompletny i pozwala na sterowanie maszynami mechanicznymi, chociaż niektóre znaki sterujące stają się coraz mniej przydatne w komputerach, jak np. znak dzwonka, 0x07, jeśli dobrze pamiętam ... Niektóre zapomniane teksty musiały być pierwotnie przechwycone za pomocą znaków sterujących do maszyn do pisania sterowanych elektrycznie i utrwalił model ...
Właściwie poprawną odmianą byłoby po prostu dołączenie \ r, wysuw wiersza, powrót karetki jest niepotrzebny, to znaczy automatyczny, stąd:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
byłby najbardziej poprawnym sposobem obsługi wszystkich typów plików. Zauważ jednak, że \ nw TEKST trybie jest w rzeczywistości parą bajtów 0x0d 0x0a, ale 0x0d JEST po prostu \ r: \ n obejmuje \ r w trybie TEKST , ale nie w trybie BINARNYM , więc \ n i \ r \ n są równoważne ... lub Powinien być. W rzeczywistości jest to bardzo podstawowe zamieszanie w branży, typowa bezwładność w branży, ponieważ konwencja mówi o CRLF, na WSZYSTKICH platformach, a następnie należy do różnych interpretacji binarnych. Ściśle mówiąc, pliki zawierające TYLKO 0x0d (powrót karetki) jako \ n (CRLF lub nowy wiersz) są zniekształcone w TEKŚCIEtryb (maszyna do pisania: po prostu zwróć samochód i przekreśl wszystko ...) i są nieliniowym formatem binarnym (albo \ r lub \ r \ n, czyli zorientowanym na wiersz), więc nie powinieneś czytać jako tekstu! Kod powinien zawieść, być może z jakąś wiadomością użytkownika. Nie zależy to tylko od systemu operacyjnego, ale także od implementacji biblioteki C, co zwiększa zamieszanie i możliwe warianty ... (szczególnie w przypadku przezroczystych warstw tłumaczenia UNICODE, dodając kolejny punkt artykulacji dla mylących odmian).
Problem z poprzednim fragmentem kodu (mechaniczna maszyna do pisania) polega na tym, że jest on bardzo nieefektywny, jeśli nie ma \ n znaków po \ r (automatyczna maszyna do pisania). Wtedy też zakłada tryb BINARNY , w którym biblioteka C jest zmuszona ignorować interpretacje tekstu (ustawienia regionalne) i oddawać zwykłe bajty. Nie powinno być różnicy w rzeczywistych znakach tekstu między obydwoma trybami, tylko w znakach kontrolnych, więc ogólnie rzecz biorąc, czytanie BINARY jest lepsze niż tryb TEKST . To rozwiązanie jest wydajne dla BINARYtryb typowych plików tekstowych systemu operacyjnego Windows niezależnie od odmian biblioteki C i nieefektywny w przypadku innych formatów tekstowych platformy (w tym tłumaczenia stron internetowych na tekst). Jeśli zależy Ci na wydajności, najlepszym rozwiązaniem jest użycie wskaźnika funkcji, wykonanie testu kontrolek linii \ r vs \ r \ n w dowolny sposób, a następnie wybranie najlepszego kodu użytkownika getline do wskaźnika i wywołanie go z to.
Nawiasem mówiąc, pamiętam, że znalazłem też kilka plików tekstowych \ r \ r \ n ... co przekłada się na tekst w dwóch wierszach, tak jak jest to nadal wymagane przez niektórych użytkowników tekstu drukowanego.