/ *g ọi hàm g() biến b được cấp phát
1. Kênh xuất nhập là gì?
Kênh xuất nhập (stream) là một khái niệm quan trọng trong hệ thống vào ra qua vùng đệm của C. Đây là một phương thức vào ra bậc cao hoàn toàn độc lập với thiết bị phần cứng và hệ điều hành. Các thiết bị vật lí mặc dù có cách thức hoạt động vào ra dữ liệu rất khác nhau nhưng đều giao tiếp với chương trình qua vùng đệm (là một vùng nhớ đặt dữ liệu vào ra và được gọi là kênh). Các hàm xử lí đọc và ghi dữ liệu trong chương trình chỉ thao tác với dữ liệu ở vùng đệm
này. Chính vì vậy mà chỉ có một phương thức chung đọc và ghi dữ liệu cho tất cả các loại thiết bị vào ra và lưu trữ dữ liệu như tệp, màn hình, bàn phím, máy in,…
Hình 10: Mơ hình hoạt động của kênh xuất nhập
Trong một chương trình ln có 3 kênh chuẩn phục vụ vào ra dữ liệu. Đó là các kênh: - stdin: kênh nhập dữ liệu chuẩn
- stdout: kênh xuất dữ liệu chuẩn - stderr: kênh báo lỗi chuẩn
Trong thực tế hàm scanf() đã tìm hiểu thực hiện lấy dữ liệu trên kênh stdin, còn hàm printf() xuất dữ liệu ra kênh stdout. Nhưng vì khi một chương trình chạy bình thường các kênh stdin, stdout và stderr thường được gắn với thiết bị vào ra chuẩn là bàn phím và màn hình nên chúng ta thường coi chúng là các hàm làm việc với bàn phím và màn hình. Tuy vậy các kênh xuất nhập chuẩn của chương trình hồn tồn có thể đổi hướng sang các thiết bị khác. Khi đó thay vì kết quả của chương trình được in ra màn hình thì có thể được in ra máy in chẳng hạn, dữ liệu vào cho chương trình thay vì phải nhập bằng tay thì có thể lấy từ một tệp.
Ví dụ:
/* một chương trình được dịch thành tệp chương trình test trên Unix */ void main() { int a; scanf("%d", &a); printf("a = %d", a); }
/* chạy chương trình trên Unix */
/* chương trình được chạy khơng có đổi hướng vào ra chuẩn */ $test
10 a = 10 a = 10
/* đổi hường vào chuẩn cho chương trình
dữ liệu được lấy từ tệp songuyen.txt chứa số 10 */ $test <songuyen.txt
/* đổi hướng ra chuẩn cho chương trình, kết quả lưu vào tệp ketqua.txt */ $test >ketqua.txt
10
/* nội dung tệp ketqua.txt chứa a = 10 */