Bạn đang đọc tệp ở BINARY hay ở chế độ TEXT ? Trong chế độ TEXT , cặp ký tự xuống dòng / nguồn cấp dữ liệu dòng, CRLF , được hiểu là TEXT cuối dòng hoặc ký tự cuối dòng, nhưng trong BINARY bạn chỉ tìm nạp MỘT byte tại một thời điểm, có nghĩa là một trong hai ký tự PHẢIđược bỏ qua và để lại trong bộ đệm để được tìm nạp như một byte khác! Vận chuyển trở lại có nghĩa là, trong máy đánh chữ, xe máy đánh chữ, nơi đặt cánh tay in, đã đạt đến mép bên phải của giấy và được đưa trở lại mép bên trái. Đây là một mô hình rất cơ học, của máy đánh chữ cơ học. Sau đó, bộ nạp dòng có nghĩa là cuộn giấy được xoay lên một chút để giấy ở vị trí để bắt đầu một dòng nhập khác. Như tôi nhớ, một trong những chữ số thấp trong ASCII có nghĩa là di chuyển sang phải một ký tự mà không cần nhập, ký tự chết và tất nhiên \ b có nghĩa là backspace: di chuyển ô tô trở lại một ký tự. Bằng cách đó, bạn có thể thêm các hiệu ứng đặc biệt, chẳng hạn như gạch dưới (gõ gạch dưới), gạch ngang (gõ trừ), gần đúng các dấu khác nhau, hủy bỏ (gõ X) mà không cần bàn phím mở rộng, chỉ bằng cách điều chỉnh vị trí của ô tô dọc theo dòng trước khi vào nguồn cấp dòng. Vì vậy, bạn có thể sử dụng điện áp ASCII có kích thước byte để tự động điều khiển máy đánh chữ mà không cần máy tính ở giữa. Khi máy đánh chữ tự động được giới thiệu,TỰ ĐỘNG có nghĩa là khi bạn đến mép giấy xa nhất, ô tô được trả về bên trái VÀ áp dụng nguồn cấp dòng, tức là ô tô được giả định sẽ tự động quay lại khi cuộn giấy di chuyển lên! Vì vậy, bạn không cần cả hai ký tự điều khiển, chỉ một, \ n, dòng mới hoặc nguồn cấp dữ liệu dòng.
Điều này không liên quan gì đến lập trình nhưng ASCII cũ hơn và HEY! có vẻ như một số người đã không suy nghĩ khi họ bắt đầu làm những việc bằng văn bản! Nền tảng UNIX giả định một máy đánh máy tự động chạy điện; mô hình Windows hoàn thiện hơn và cho phép điều khiển các máy cơ học, mặc dù một số ký tự điều khiển ngày càng trở nên ít hữu ích hơn trong máy tính, như ký tự chuông, 0x07 nếu tôi nhớ rõ ... Một số đoạn văn bản bị quên ban đầu phải được ghi lại bằng các ký tự điều khiển cho máy đánh chữ điều khiển bằng điện và nó duy trì mô hình ...
Trên thực tế, biến thể chính xác sẽ là chỉ bao gồm \ r, nguồn cấp dữ liệu dòng, dấu xuống dòng là không cần thiết, nghĩa là tự động, do đó:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
sẽ là cách chính xác nhất để xử lý tất cả các loại tệp. Tuy nhiên, lưu ý rằng \ n trong chế độ TEXT thực tế là cặp byte 0x0d 0x0a, nhưng 0x0d CHỈ LÀ \ r: \ n bao gồm \ r ở chế độ TEXT nhưng không bao gồm trong BINARY , vì vậy \ n và \ r \ n là tương đương ... hoặc nên là. Đây thực sự là một sự nhầm lẫn rất cơ bản trong ngành, quán tính điển hình của ngành, như quy ước là nói về CRLF, trong TẤT CẢ các nền tảng, sau đó rơi vào các cách hiểu nhị phân khác nhau. Nói một cách chính xác, các tệp CHỈ bao gồm 0x0d (ký tự xuống dòng) là \ n (CRLF hoặc nguồn cấp dữ liệu dòng), không đúng định dạng trong TEXT(máy đánh chữ: chỉ cần trả xe và gạch ngang mọi thứ ...), và là định dạng nhị phân không định hướng dòng (hoặc \ r hoặc \ r \ n nghĩa là định hướng dòng) nên bạn không được phép đọc dưới dạng văn bản! Mã có thể bị lỗi với một số thông báo của người dùng. Điều này không chỉ phụ thuộc vào hệ điều hành mà còn phụ thuộc vào việc triển khai thư viện C, làm tăng thêm sự nhầm lẫn và các biến thể có thể xảy ra ... (đặc biệt đối với các lớp dịch UNICODE trong suốt thêm một điểm khớp nối khác cho các biến thể khó hiểu).
Vấn đề với đoạn mã trước (máy đánh chữ cơ học) là nó rất kém hiệu quả nếu không có \ n ký tự nào sau \ r (văn bản máy đánh chữ tự động). Sau đó, nó cũng giả định chế độ BINARY trong đó thư viện C buộc phải bỏ qua các diễn giải văn bản (ngôn ngữ) và cho đi các byte tuyệt đối. Không nên có sự khác biệt về các ký tự văn bản thực giữa cả hai chế độ, chỉ ở các ký tự điều khiển, vì vậy nói chung đọc BINARY tốt hơn chế độ TEXT . Giải pháp này hiệu quả đối với BINARYchế độ các tệp văn bản điển hình của Hệ điều hành Windows độc lập với các biến thể thư viện C và không hiệu quả đối với các định dạng văn bản nền tảng khác (bao gồm cả bản dịch web thành văn bản). Nếu bạn quan tâm đến hiệu quả, cách thực hiện là sử dụng con trỏ hàm, thực hiện kiểm tra các điều khiển dòng \ r so với \ r \ n theo cách bạn muốn, sau đó chọn mã người dùng getline tốt nhất vào con trỏ và gọi nó từ nó.
Tình cờ tôi nhớ rằng tôi cũng tìm thấy một số tệp văn bản \ r \ r \ n ... dịch thành văn bản dòng đôi giống như yêu cầu của một số người tiêu dùng văn bản in.