Input/Output stream C++

####Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.

Trong bài học này, mình sẽ giới thiệu lại một số stream mà các bạn đã được học trong những chương đầu tiên của khóa học lập trình này và một số stream khác mà chúng ta sẽ sử dụng trong các bài học tiếp theo.

###Input/Output streams

Input và output streams không được định nghĩa như là một phần của core C++, nhưng nó được cung cấp thông qua C++ standard library (được định nghĩa bên trong namespace std). Trong các bài học trước, các bạn thường sử dụng std::cin, std::cout … trong thư viện iostream để thực hiện các thao tác input và output đơn giản. Chúng ta cùng xem một cách tổng thể các stream trong C++ được định nghĩa như thế nào.

Ứng với mỗi hình chữ nhật màu trắng trong hình trên là một class trong C++. Các stream trong C++ đều có quan hệ thừa kế với class ios. Và các đối tượng std::cin, std::cout, … đều được khai báo bên trong file iostream, do đó khi các bạn khai báo thư viện iostream thì có thể dùng các đối tượng này.

Đa phần các thao tác liên quan đến Input/Output trong C++ đều được thực thi với các stream. Một cách trừu tượng, một stream là một chuỗi các kí tự được truy cập một cách tuần tự. Theo thời gian, một stream có thể sản xuất hoặc tiêu thụ một lượng dữ liệu không giới hạn.

Chúng ta chia ra làm 2 loại stream chính: Input và Output.

  • Input stream dùng để lưu giữ dữ liệu đầu vào từ data producer, như là bàn phím, file, hoặc một network. Ví dụ, một người dùng ấn một phím khi chương trình hiện tại không yêu cầu bất kỳ dữ liệu đầu vào nào, nó sẽ được lưu tạm thời trong Input stream.

  • Output stream dùng để lưu giữ dữ liệu đầu ra cho một data consumer nào đó, như là màn hình, file hoặc printer. Khi chúng ta muốn ghi dữ liệu lên một output device, có thể lúc này device chưa chấp nhận dữ liệu ngay, dữ liệu sẽ được lưu tạm thời trong Output stream.

File vừa có thể là một Input source, vừa có thể là một Output source.

Các class istream và ostream được định nghĩa liên kết mặc định với các standard Input/Output.

  • Class istream được sử dụng để trao đổi dữ liệu với các Standard Input streams. Với các input stream, extraction operator (>>) được dùng để xóa bỏ các giá trị trong stream. Điều này có nghĩa là khi người dùng ấn một phím trên bàn phím, key code sẽ được lưu giữ trong input stream, chương trình khác sẽ trích xuất dữ liệu trong input stream ra để sử dụng.

  • Class ostream được sử dụng để trao đổi dữ liệu với các Standard Output streams. Với các output stream, insertion operator (<<) được dùng để thêm các giá trị vào trong stream. Điều này có nghĩa là khi các bạn đưa dữ liệu vào trong output stream, các thiết bị đầu ra sẽ sử dụng chúng.

###Input/Output with File C++

Như mình đã nhắc đến ở trên, File là một đối tượng có thể được dùng làm Input source, cũng có thể dùng làm Output source. Ngôn ngữ C++ đã định nghĩa sẵn cho chúng ta các class stream dùng để thao tác Input và Output trên File như ifstream (Input file stream), ofstream (Output file stream). Những đối tượng tạo ra từ các class này sẽ đóng vai trò như một stream trung gian để truyền dữ liệu tuần tự vào file hoặc từ file ra.

  • Extraction operator (>>) dùng cho các đối tượng của class ifstream dùng để trích xuất dữ liệu trong file đưa vào chương trình.

  • Insertion operator (<<) dùng cho các đối tượng của class ofstream dùng để đưa dữ liệu trong chương trình vào lưu trữ trong file.

Do class ifstream được thừa kế từ class istream nên cách hoạt động của các đối tượng của class ifstream cũng giống như đối tượng std::cin, và các đối tượng của class ofstream cũng hoạt động tương tự như đối tượng std::cout của class ostream, nên mình nghĩ trong các bài học tiếp theo các bạn có thể nắm bắt được khá nhanh các thao tác trên file sử dụng các stream này.

###Streams for strings

Các đối tượng của các class stream đóng vai trò bộ truyền dẫn dữ liệu, là đối tượng trung gian giữa chương trình và các thiết bị (hoặc file). Bên cạnh đó, ngôn ngữ C++ còn định nghĩa một số class stream khác giúp chúng ta làm việc với std::string. Do std::string cũng là một kiểu dữ liệu tuần tự, nên sử dụng một stream để truyền dữ liệu vào cho std::string sẽ thuận tiện hơn.

Stream cho std::string mà ngôn ngữ C++ cung cấp là class stringstream được định nghĩa trong thư viện sstream.


###Tổng kết

Mình vừa giới thiệu đến các bạn một số class stream trong ngôn ngữ C++ mà các bạn đã được học và sẽ học trong một số bài học tiếp theo.


Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn.

www.daynhauhoc.com

6 Likes

Cho mình hỏi là in/output stream có khác với stdin và stdout không? vì theo định nghĩa ở trên thì khi người dùng nhấn phím khi chương trình chưa yêu cầu nhập thì kí tự đó sẽ tạm thời đc lưu trong input stream, vậy nó khác với stdin vì hàm cin sẽ lấy dữ liệu trong stdin.
Ý mình ở đây là input stream có vẻ giống với lưu tạm vào bộ đệm bàn phím và các hàm như getch và getche sẽ lấy giữ liệu ở đây, còn getchar vẫn là lấy trong stdin

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?