C++ Đầu vào/đầu ra cơ bản: Ví dụ về Cout, Cin, Cerr

⚡ Tóm tắt thông minh

C++ Các thao tác nhập và xuất dữ liệu dựa trên các đối tượng luồng, di chuyển dữ liệu dưới dạng chuỗi byte giữa các chương trình và thiết bị, trong đó cin đọc dữ liệu nhập từ bàn phím, còn cout, cerr và clog ghi dữ liệu ra màn hình.

  • 🔘 Dòng: Các tác vụ nhập và xuất dữ liệu được thực hiện dưới dạng chuỗi byte gọi là luồng, di chuyển dữ liệu giữa bộ nhớ chính và các thiết bị.
  • 📥 Các tệp tiêu đề: Các thư viện iostream, iomanip và fstream định nghĩa các đối tượng và bộ điều khiển được sử dụng cho các thao tác nhập và xuất cơ bản.
  • 🖨️ cout và cin: Đối tượng `cout` in bằng toán tử chèn, trong khi `cin` đọc giá trị bằng toán tử mở.tractoán tử tion.
  • ⚠️ cerr và tắc nghẽn: Cả hai đều báo lỗi, tuy nhiên cerr hiển thị ngay lập tức mà không cần bộ đệm, trong khi clog đệm các thông báo trước.
  • 🛠️ Xử lý lỗi: Các kiểm tra trạng thái tốt, xấu, thất bại và kết thúc tệp đọc trạng thái luồng, do đó các thao tác thất bại được bắt giữ một cách an toàn.
  • 🤖 Hỗ trợ AI: Các trợ lý lập trình AI như GitHub Copilot tạo ra các đoạn mã mẫu cin và cout từ một đoạn bình luận ngắn hoặc tên hàm.

C++ Đầu vào đầu ra cơ bản

Luồng trong là gì C++?

C++ cung cấp cho người dùng một số thư viện mà họ có thể sử dụng để thực hiện các tác vụ đầu vào/đầu ra. Các tác vụ này được thực hiện dưới dạng chuỗi byte, thường được gọi là luồng.

Các luồng được chia thành hai:

Các loại luồng

  • Luồng đầu vào: Đây là một loại luồng trong đó các byte truyền từ một thiết bị như bàn phím đến bộ nhớ chính.
  • Luồng đầu ra: Đây là loại luồng trong đó các byte chảy theo hướng ngược lại, tức là từ bộ nhớ chính đến thiết bị như màn hình hiển thị.

Các luồng hoạt động như thế nào?

C++ luồng hoạt động như sau:

  1. Đầu tiên, một luồng được khởi tạo với đúng loại.
  2. Tiếp theo, bạn nên chỉ rõ vị trí xảy ra thao tác I/O bằng cách sử dụng con trỏ get/put.
  3. Sau khi đến đúng vị trí trong luồng, bạn có thể thực hiện các tác vụ đầu vào và đầu ra bằng cách sử dụng toán tử >> và << tương ứng.

Bảng chức năng

Sau đây là các chức năng được cung cấp trong tệp tiêu đề stream.h:

LớpChức năng
FilebufNó thiết lập bộ đệm tệp để đọc/ghi. Nó có các hàm close() và open() trong đó
cơ sở dữ liệuĐây là lớp cơ sở cho các lớp ifstream, fstream và ofstream. Hoạt động của nó là phổ biến đối với các luồng tập tin.
nếu dòngĐây là lớp luồng tệp đầu vào để cung cấp các hoạt động đầu vào.
ngoài dòngĐây là lớp luồng tệp đầu ra để cung cấp các hoạt động đầu ra.
dòng chảyĐây là lớp luồng đầu vào/đầu ra. Nó hỗ trợ các hoạt động đầu vào/đầu ra đồng thời.

C++ Tệp tiêu đề cho Đầu vào/Đầu ra

C++ cung cấp ba thư viện đi kèm với các chức năng để thực hiện các tác vụ nhập/xuất cơ bản. Chúng bao gồm:

  • Dòng chảy: Đó là từ viết tắt của luồng đầu vào/đầu ra tiêu chuẩn. Tệp tiêu đề này đi kèm với các định nghĩa cho các đối tượng như cin/ cout/cerr.
  • Iomanip: Đó là từ viết tắt của bộ điều khiển đầu vào/đầu ra. Thư viện đi kèm với các chức năng có thể được sử dụng để thao tác với các luồng. Nó chứa các định nghĩa cho các đối tượng như setw, setprecision và các đối tượng khác.
  • Dòng chảy: Đây là tệp tiêu đề để mô tả luồng tệp. Nó xử lý dữ liệu được đọc từ tệp dưới dạng đầu vào hoặc được ghi vào tệp, đầu ra.

Từ khóa cin và cout rất phổ biến ở C++. Chúng được sử dụng để lấy đầu vào và đầu ra in tương ứng. Để sử dụng chúng, bạn phải đưa tệp tiêu đề iostream vào chương trình của mình. Lý do là chúng được xác định trong tệp tiêu đề đó. Việc không bao gồm tệp tiêu đề iostream sẽ gây ra lỗi. Điều này là kết quả của sự thất bại của C++ trình biên dịch để hiểu ý nghĩa của từ khóa.

Các đối tượng chính được xác định trong tệp tiêu đề iostream là cin, cout, cerr và clog. Hãy thảo luận về chúng.

std :: cout

Đối tượng cout là một thể hiện của lớp iostream. Nó được sử dụng để tạo đầu ra trên thiết bị đầu ra tiêu chuẩn, thường là màn hình. Nó được sử dụng cùng với toán tử chèn luồng (<<).

Ví dụ

#include <iostream>
using namespace std;
int main() {

	char welcome[] = "Welcome to Guru99";

	cout << welcome << endl;

	return 0;
}

Đầu ra:

std :: cout

Đây là ảnh chụp màn hình của mã:

std :: cout

Code Giải thích:

  1. Bao gồm tệp tiêu đề iostream nơi đối tượng cout được xác định.
  2. Bao gồm không gian tên std để chúng ta không phải gọi nó khi sử dụng các lớp của nó.
  3. Gọi hàm main(). Mã chương trình phải được thêm vào trong phần thân của nó. Dấu ngoặc nhọn mở đầu { đánh dấu sự bắt đầu của phần thân.
  4. Tạo một biến ký tự có tên là welcome để lưu trữ chuỗi "Welcome to" Guru99.
  5. In giá trị của chuỗi chào mừng trên bảng điều khiển. Cuối cùng là một C++ từ khóa có nghĩa là dòng cuối cùng. Nó di chuyển con trỏ để bắt đầu in văn bản trên dòng tiếp theo.
  6. Chương trình phải trả về giá trị khi thực hiện thành công.
  7. Kết thúc phần thân của hàm main().

std::cin

Đối tượng cin là một thể hiện của lớp istream. Nó đọc dữ liệu đầu vào từ thiết bị nhập liệu, bàn phím. Nó thường được sử dụng cùng với extractoán tử − (>>). Ví dụtracĐối tượng tion chịu trách nhiệm cho extracDữ liệu được nhập qua bàn phím từ đối tượng cin.

Ví dụ

Ví dụ sau đây minh họa cách sử dụng từ khóa cin trong C++:

#include <iostream>
using namespace std;
int main()
{
	int number;

	cout << "Enter a number:";
	cin >> number;
	cout << "\nYou entered: " << number;

	return 0;
}

Đầu ra:

std::cin

Đây là ảnh chụp màn hình của mã:

std::cin

Code Giải thích:

  1. Đưa tệp tiêu đề iostream vào chương trình của chúng tôi. Đối tượng cin được xác định trong tệp tiêu đề này.
  2. Bao gồm không gian tên std để sử dụng các lớp của nó. Bạn sẽ không phải gọi std khi sử dụng các lớp của nó.
  3. Gọi hàm main(). Mã chương trình phải được thêm vào trong phần thân của nó.
  4. Sự bắt đầu của phần thân của chương trình.
  5. Khai báo một biến số nguyên số có tên.
  6. In thông báo lên màn hình nhắc người dùng nhập số.
  7. Đọc giá trị do người dùng nhập vào bảng điều khiển từ bàn phím.
  8. In giá trị đọc ở trên trên bảng điều khiển cùng với văn bản khác.
  9. Chương trình sẽ trả về một giá trị nếu nó thực thi thành công.
  10. Kết thúc phần thân của hàm chính.

std::cerr

Đối tượng cerr tạo ra luồng lỗi tiêu chuẩn để xuất ra các lỗi trong C++. Cerr là một thể hiện của lớp ostream. Đối tượng cerr không được đệm. Điều này có nghĩa là nó được sử dụng khi thông báo lỗi cần được hiển thị ngay lập tức.

Vì nó không được đệm nên nó không lưu trữ thông báo lỗi để hiển thị sau. Nó được sử dụng cùng với toán tử chèn luồng (<<).

Ví dụ

#include <iostream>
using namespace std;
int main() {

	cerr << "An Error occurred!";

	return 0;
}

Đầu ra:

std::cerr

Đây là ảnh chụp màn hình của mã:

std::cerr

Code Giải thích:

  1. Bao gồm tệp tiêu đề iostream trong đó đối tượng cerr đã được xác định.
  2. Bao gồm không gian tên std để chúng ta không phải gọi nó khi sử dụng các lớp của nó.
  3. Gọi hàm main(). Logic chương trình nên được thêm vào trong phần thân của nó. Dấu ngoặc nhọn mở đầu đánh dấu sự bắt đầu của phần thân hàm.
  4. Sử dụng đối tượng cerr để in lỗi trên bảng điều khiển.
  5. Chương trình phải trả về một giá trị khi thực hiện thành công.
  6. Kết thúc phần thân của hàm chính.

std::làm tắc nghẽn

Đối tượng clog là một thể hiện của lớp ostream. Nó được sử dụng để hiển thị lỗi trên màn hình chuẩn, màn hình. Nó tương tự như đối tượng cerr, nhưng nó được đệm. Vì nó được đệm, nó lưu trữ thông báo lỗi trong bộ đệm cho đến khi bộ đệm được lấp đầy/xóa. Nó được sử dụng cùng với toán tử chèn luồng (<<).

Ví dụ

#include <iostream>
using namespace std;
int main() {
	clog << "An Error occurred!";
	return 0;
}

Đầu ra:

std::làm tắc nghẽn

Đây là ảnh chụp màn hình của mã:

std::làm tắc nghẽn

Code Giải thích:

  1. Bao gồm tệp tiêu đề iostream trong đó đối tượng tắc nghẽn được xác định.
  2. Bao gồm không gian tên std để chúng ta có thể sử dụng các lớp của nó mà không cần gọi nó.
  3. Gọi hàm main(). Logic chương trình nên được thêm vào trong phần thân của nó. { đánh dấu sự bắt đầu của phần thân hàm.
  4. Sử dụng đối tượng tắc nghẽn để in lỗi trên đầu ra tiêu chuẩn, màn hình.
  5. Chương trình phải trả về một giá trị sau khi hoàn thành thành công.
  6. Phần cuối của hàm main().

Xử lý lỗi với luồng IO

Các đối tượng luồng tương tự cũng báo cáo liệu một thao tác có thành công hay không, điều mà việc kiểm tra trạng thái luồng cho biết.

Để kiểm tra xem một luồng có hợp lệ hay không, bạn có thể sử dụng luồng đó làm Boolean.

Đây là một ví dụ:

ifstream file( "myfile.txt" );
if ( ! file )
{
        cout << "File NOT opened!" << endl;
}

Để biết thêm chi tiết về trạng thái luồng, bạn có thể sử dụng các hàm sau:

  • good()- sẽ trả về true nếu tất cả đều ổn.
  • bad()- sẽ trả về true nếu xảy ra lỗi nghiêm trọng.
  • failed()- sẽ trả về true sau hoạt động truyền phát không thành công.
  • eof()- sẽ trả về true nếu nó đến cuối tệp.

Để biết liệu một thao tác đọc/ghi cụ thể có thất bại hay không, hãy kiểm tra kết quả đọc.

Ví dụ: để kiểm tra xem người dùng đã nhập số nguyên hợp lệ hay chưa, hãy thực hiện việc này:

int p;
if ( cin >> p ) 
{
        cout << "Enter valid number" << endl;
}

Câu Hỏi Thường Gặp

Đối tượng `cout` an toàn về kiểu dữ liệu và sử dụng toán tử chèn, do đó nó tự động phát hiện kiểu dữ liệu của từng giá trị. Hàm `printf` của C dựa vào các định dạng chỉ định như `%d` mà người dùng phải tự điều chỉnh sao cho khớp với các đối số.

Người tình cũtracToán tử tion dừng lại ở khoảng trắng đầu tiên, vì vậy cin chỉ đọc một từ. Để bắt toàn bộ một dòng có khoảng trắng, hãy gọi getline(cin, variable), hàm này sẽ đọc đến ký tự xuống dòng.

Cả hai lệnh đều bắt đầu một dòng mới, nhưng `endl` cũng xóa bộ đệm đầu ra mỗi lần thực hiện, điều này có thể làm chậm các vòng lặp bận rộn. Nên ưu tiên sử dụng xuống dòng thông thường và chỉ dùng `endl` khi cần xóa bộ đệm ngay lập tức.

Các đối tượng cin, cout, cerr và clog nằm trong không gian tên std. Việc viết mã bằng cách sử dụng không gian tên std cho phép bạn gõ cout thay vì std::cout. Các dự án lớn thường giữ nguyên tiền tố std để tránh xung đột.

Bao gồm phần tiêu đề iomanip và sử dụng các bộ điều khiển với cout. Bộ điều khiển setw dành riêng một độ rộng trường, và setprecision thiết lập số lượng chữ số hiển thị, định dạng số và cột mà không thay đổi các giá trị đã lưu trữ.

Đúng vậy. Vì cout và cerr là các luồng riêng biệt, nên shell có thể chuyển hướng đầu ra thông thường vào một tệp trong khi lỗi vẫn hiển thị trên màn hình. Trong mã, rdbuf có thể trỏ một luồng đến một bộ đệm khác.

Đúng vậy. Trợ lý lập trình AI đọc một bình luận hoặc tên hàm và tạo ra các câu lệnh cin và cout, cùng với lệnh include iostream và một lời nhắc được định dạng. RevViệc xem xét logic luồng được tạo ra cho các trường hợp ngoại lệ vẫn là điều nên làm.

Vâng. Trợ lý GitHub Hoàn tất định dạng cout, vòng lặp kiểm tra cin và kiểm tra lỗi cerr khi bạn gõ. (Phiên bản 2026) C++ Trí thông minh mã hóa bổ sung khả năng nhận biết ký hiệu ngữ nghĩa, đảm bảo các đề xuất đa tệp luôn nhất quán.

Tóm tắt bài viết này với: