Nhập/xuất C++ xảy ra trong các dòng của các byte. Một dòng đơn giản là một dãy tuần tự các byte. Trong các thao tác nhập, các byte chảy từ thiết bị (chẳng hạn: một bàn phím, một ổ đĩa, một kết nối mạng) tới bộ nhớ chính. Trong các thao tác xuất, các byte chảy từ bộ nhớ chính tới một thiết bị (chẳng hạn: một màn hình, một máy in, một ổ đĩa, một kết nối mạng).
Ưùng dụng liên kết với các byte. Các byte có thể biểu diễn các ký tự ASCII, bên trong định dạng dữ liệu thô, các ảnh đồ họa, tiếng nói số, hình ảnh số hoặc bất cứ loại thông tin một ứng dụng có thể đòi hỏi.
Công việc của các cơ chế hệ thống nhập/xuất là di chuyển các byte từ các thiết bị tới bộ nhớ và ngược lại theo lối chắc và đáng tin cậy. Như thế các di chuyển thường bao gồm sự di chuyển cơ học như sự quay của một đĩa hoặc một băng từ, hoặc nhấn phím tại một bàn phím. Thời gian các di chuyển này thông thường khổng lồ so với thời gian bộ xử lý thao tác dự liệu nội tại. Vì thế, các thao tác nhập/xuất đòi hỏi có kế hoạch cẩn thận và điều chỉnh để bảo đảm sự thi hành tối đa.
C++ cung cấp cả hai khả năng nhập/xuất "mức thấp" (low-level) và "mức cao" (high-level). Các khả năng nhập/xuất mức thấp (nghĩa là nhập/xuất không định dạng) chỉ định cụ thể số byte nào đó phải được di chuyển hoàn toàn từ thiết bị tới bộ nhớ hoặc từ bộ nhớ tới thiết bị. Trong các di chuyển như thế, byte riêng rẽ là mục cần quan tâm. Vì thế các khả năng mức thấp cung cấp tốc độ cao, các di chuyển dung lượng cao, nhưng các khả năng này không phải là tiện lợi lắm cho lập trình viên.
Các lập trình viên ưu thích quan điểm nhập/xuất mức cao, nghĩa là nhập/xuất có định dạng, trong đó các byte được nhóm thành các đơn vị có ý nghĩa như các số nguyên, các số chấm động, các ký tự, các chuỗi và các kiểu do người dùng định nghĩa.
Các file header của thư viện iostream
Thư viện iostream của C++ cung cấp hàng trăm khả năng của nhập/xuất. Một vài tập tin header chứa các phần của giao diện thư viện.
Phần lớn chương trình C++ thường include tập tin header <iostream.h> mà chứa các thông tin cơ bản đòi hỏi tất cả các thao tác dòng nhập/xuất. Tập tin header <iostream.h> chứa các đối tượng cin, cout, cerr và clog mà tương ứng với dòng nhập chuẩn, dòng xuất chuẩn, dòng lỗi chuẩn không vùng đệm và dòng lỗi chuẩn vùng đệm. Cả hai khả năng nhập/xuất định dạng và không định dạng được cung cấp.
Header <iomanip.h> chứa thông tin hữu ích cho việc thực hiện nhập/xuất định dạng với tên gọi là các bộ xử lý dòng biểu hiện bằng tham số (parameterized stream manipulators).
Header <fstream.h> chứa các thông tin quan trọng cho các thao tác xử lý file do người dùng kiểm soát.
Header <strstream.h> chứa các thông tin quan trọng cho việc thực hiện các định dạng trong bộ nhớ. Điều này tương tự xử lý file, nhưng các thao tác nhập/xuất tới và từ mảng các ký tự hơn là file.
Header <stdiostream.h> chứa các thông tin quan trọng cho các chương trình trộn các kiểu nhập/xuất của C và C++. Các chương trình mới phải tránh kiểu nhập/xuất C, nhưng cần thì hiệu chỉnh các chương trình C, hoặc tiến triển chương trình C thành C++.
Các lớp và các đối tượng của dòng nhập/xuất
Thư viện iostream chứa nhiều lớp để xử lý một sự đa dạng rộng của các thao tác nhập/xuất. Lớp istream hỗ trợ các thao tác dòng nhập. Lớp ostream hỗ trợ các thao tác dòng xuất. Lớp iostream hỗ trợ cả hai thao tác dòng nhập và dòng xuất. Lớp istream và lớp ostream đều kế thừa đơn từ lớp cơ sở ios. Lớp iostream được kế thừa thông qua đa kế thừa từ hai lớp istream và ostream.
![]() |
Hình 8.1: Một phần của phân cấp lớp dòng nhập/xuất
Đa năng hóa toán tử cung cấp một ký hiệu thích hợp cho việc thực hiện nhập/xuất. Toán tử dịch chuyển trái (<<) được đa năng hóa để định rõ dòng xuất và được tham chiếu như là toán tử chèn dòng. Toán tử dịch chuyển phải (>>) được đa năng hóa để định rõ dòng nhập và được tham chiếu như là toán tử trích dòng. Các toán tử này được sử dụng với các đối tượng dòng chuẩn cin, cout, cerr và clog, và bình thường với các đối tượng dòng do người dùng định nghĩa.
cin là một đối tượng của lớp istream và được nói là "bị ràng buộc tới" (hoặc kết nối tới) thiết bị nhập chuẩn, thông thường là bàn phím. Toán tử trích dòng được sử dụng ở lệnh sau tạo ra một giá trị cho biến nguyên X được nhập từ cin tới bộ nhớ:
int X;
cin >> X;
cout là một đối tượng của lớp ostream và được nói là "bị ràng buộc tới" thiết bị xuất chuẩn, thông thường là màn hình. Toán tử chèn dòng được sử dụng ở lệnh sau tạo ra một giá trị cho biến nguyên X được xuất từ bộ nhớ tới thiết bị chuẩn:
cout << X;
cerr là một đối tượng của lớp ostream và được nói là "bị ràng buộc tới" thiết bị lỗi chuẩn. Việc xuất đối tượng cerr là không vùng đệm. Điều này có nghĩa là mỗi lần chèn tới cerr tạo ra kết xuất của nó xuất hiện ngay tức thì; Điều này thích hợp cho việc thông báo nhanh chóng người dùng khi có sự cố.
clog là một đối tượng của lớp ostream và được nói là "bị ràng buộc tới" thiết bị lỗi chuẩn. Việc xuất đối tượng cerr là có vùng đệm. Điều này có nghĩa là mỗi lần chèn tới cerr tạo ra kết xuất của nó được giữ trong vùng đệm cho đến khi vùng đệm đầy hoặc vùng đệm được flush.
Việc xử lý file của C++ sử dụng các lớp ifstream để thực hiện các thao tác nhập file, ofstream cho các thao tác xuất file, và fstream cho các thao tác nhập/xuất file. Lớp ifstream kế thừa từ istream, ofstream lớp kế thừa từ ostream, và lớp fstream kế thừa từ iostream.
![]() |
Hình 8.2: Một phần của phân cấp lớp dòng nhập/xuất với việc xử lý file.




















