Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang51/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   47   48   49   50   51   52   53   54   55

NHẬP/XUẤT VỚI CIN/COUT


Như đã nhắc ở trên, cin là dòng dữ liệu nhập (đối tượng) thuộc lớp istream. Các thao tác trên đối tượng này gồm có các toán tử và hàm phục vụ nhập dữ liệu vào cho biến từ bàn phím.

Toán tử nhập >>


Toán tử này cho phép nhập dữ liệu từ một dòng Input_stream nào đó vào cho một danh sách các biến. Cú pháp chung như sau:

Input_stream >> biến1 >> biến2 >> …

trong đó Input_stream là đối tượng thuộc lớp istream. Trường hợp Input_stream là cin, câu lệnh nhập sẽ được viết:



cin >> biến1 >> biến2 >> …

câu lệnh này cho phép nhập dữ liệu từ bàn phím cho các biến. Các biến này có thể thuộc các kiểu chuẩn như : kiểu nguyên, thực, ký tự, xâu kí tự. Chú ý 2 đặc điểm quan trọng của câu lệnh trên.

Lệnh sẽ bỏ qua không gán các dấu trắng (dấu cách <>, dấu Tab, dấu xuống dòng ¿) vào cho các biến (kể cả biến xâu kí tự).

Khi NSD nhập vào dãy byte nhiều hơn cần thiết để gán cho các biến thì số byte còn lại và kể cả dấu xuống dòng ¿ sẽ nằm lại trong cin. Các byte này sẽ tự động gán cho các biến trong lần nhập sau mà không chờ NSD gõ thêm dữ liệu vào từ bàn phím. Do vậy câu lệnh

cin >> a >> b >> c;

cũng có thể được viết thành

cin >> a;

cin >> b;

cin >> c;

và chỉ cần nhập dữ liệu vào từ bàn phím một lần chung cho cả 3 lệnh (mỗi dữ liệu nhập cho mỗi biến phải cách nhau ít nhất một dấu trắng)

: Nhập dữ liệu cho các biến

int a;


float b;

char c;


char *s;

cin >> a >> b >> c >> s;

giả sử NSD nhập vào dãy dữ liệu : <><>12<>34.517ABC<>12E<>D ¿

khi đó các biến sẽ được nhận những giá trị cụ thể sau:

a = 12

b = 34.517



c = 'A'

s = "BC"


trong cin sẽ còn lại dãy dữ liệu : <>12E<>D ¿.

Nếu trong đoạn chương trình tiếp theo có câu lệnh cin >> s; thì s sẽ được tự động gán giá trị "12E" mà không cần NSD nhập thêm dữ liệu vào cho cin.

Qua ví dụ trên một lần nữa ta nhắc lại đặc điểm của toán tử nhập >> là các biến chỉ lấy dữ liệu vừa đủ cho kiểu của biến (ví dụ biến c chỉ lấy một kí tự 'A', b lấy giá trị 34.517) hoặc cho đến khi gặp dấu trắng đầu tiên (ví dụ a lấy giá trị 12, s lấy giá trị "BC" dù trong cin vẫn còn dữ liệu). Từ đó ta thấy toán tử >> là không phù hợp khi nhập dữ liệu cho các xâu kí tự có chứa dấu cách. C++ giải quyết trường hợp này bằng một số hàm (phương thức) nhập khác thay cho toán tử >>.

Các hàm nhập kí tự và xâu kí tự

Nhập kí tự


cin.get() : Hàm trả lại một kí tự (kể cả dấu cách, dấu ¿).. Ví dụ:

char ch;


ch = cin.get();

nếu nhập AB¿, ch nhận giá trị 'A', trong cin còn B¿.

nếu nhập A¿, ch nhận giá trị 'A', trong cin còn ¿.

nếu nhập ¿, ch nhận giá trị '¿', trong cin rỗng.



cin.get(ch) : Hàm nhập kí tự cho ch và trả lại một tham chiếu tới cin. Do hàm trả lại tham chiếu tới cin nên có thể viết các phương thức nhập này liên tiếp trên một đối tượng cin. Ví dụ:

char c, d;

cin.get(c).get(d);

nếu nhập AB¿ thì c nhận giá trị 'A' và d nhận giá trị 'B'. Trong cin còn 'C¿'.


Nhập xâu kí tự


cin.get(s, n, fchar) : Hàm nhập cho s dãy kí tự từ cin. Dãy được tính từ kí tự đầu tiên trong cin cho đến khi đã đủ n – 1 kí tự hoặc gặp kí tự kết thúc fchar. Kí tự kết thúc này được ngầm định là dấu xuống dòng nếu bị bỏ qua trong danh sách đối. Tức có thể viết câu lệnh trên dưới dạng cin.get(s, n) khi đó xâu s sẽ nhận dãy kí tự nhập cho đến khi đủ n-1 kí tự hoặc đến khi NSD kết thúc nhập (bằng dấu ¿).

Chú ý :

Lệnh sẽ tự động gán dấu kết thúc xâu ('\0') vào cho xâu s sau khi nhập xong.

Các lệnh có thể viết nối nhau, ví dụ: cin.get(s1, n1).get(s2,n2);

Kí tự kết thúc fchar (hoặc ¿) vẫn nằm lại trong cin. Điều này có thể làm trôi các lệnh get() tiếp theo. Ví dụ:

struct Sinhvien {

char *ht; // họ tên

char *qq; // quê quán

};

void main()



{

int i;


for (i=1; i<=3; i++) {

cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25);

cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30);

}



}

Trong đoạn lệnh trên sau khi nhập họ tên của sinh viên thứ 1, do kí tự ¿ vẫn nằm trong bộ đệm nên khi nhập quê quán chương trình sẽ lấy kí tự ¿ này gán cho qq, do đó quê quán của sinh viên sẽ là xâu rỗng.

Để khắc phục tình trạng này chúng ta có thể sử dụng một trong các câu lệnh nhập kí tự để "nhấc" dấu enter còn "rơi vãi" ra khỏi bộ đệm. Có thể sử dụng các câu lệnh sau :

cin.get(); // đọc một kí tự trong bộ đệm

cin.ignore(n); //đọc n kí tự trong bộ đệm (với n=1)

như vậy để đoạn chương trình trên hoạt động tốt ta có thể tổ chức lại như sau:

void main()

{

int i;



for (i=1; i<=3; i++) {

cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25);

cin.get(); // nhấc 1 kí tự (enter)

cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30);

cin.get() // hoặc cin.ignore(1);

}



}

cin.getline(s, n, fchar): Phương thức này hoạt động hoàn toàn tương tự phương thức cin.get(s, n, fchar), tuy nhiên nó có thể khắc phục "lỗi enter" của câu lệnh trên. Cụ thể hàm sau khi gán nội dung nhập cho biến s sẽ xóa kí tự enter khỏi bộ đệm và do vậy NSD không cần phải sử dụng thêm các câu lệnh phụ trợ (cin.get(), cin.ignore(1)) để loại enter ra khỏi bộ đệm.

cin.ignore(n): Phương thức này của đối tượng cin dùng để đọc và loại bỏ n kí tự còn trong bộ đệm (dòng nhập cin).

Chú ý: Toán tử nhập >> cũng giống các phương thức nhập kí tự và xâu kí tự ở chỗ cũng để lại kí tự enter trong cin. Do vậy, chúng ta nên sử dụng các phương thức cin.get(), cin.ignore(n) để loại bỏ kí tự enter trước khi thực hiện lệnh nhập kí tự và xâu kí tự khác.

Tương tự dòng nhập cin, cout là dòng dữ liệu xuất thuộc lớp ostream. Điều này có nghĩa dữ liệu làm việc với các thao tác xuất (in) sẽ đưa kết quả ra cout mà đã được mặc định là màn hình. Do đó ta có thể sử dụng toán tử xuất << và các phương thức xuất trong các lớp ios (lớp cơ sở) và ostream.

1   ...   47   48   49   50   51   52   53   54   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương