Chương 7 Các dòng tập tin (Stream) Nhập ký tự và chuỗi ký tự từ bàn phím

6 486 0
Chương 7 Các dòng tập tin (Stream) Nhập ký tự và chuỗi ký tự từ bàn phím

Đang tải... (xem toàn văn)

Thông tin tài liệu

Nhập tự chuỗi tự từ bàn phím Chúng ta nhận thấy toán tử nhập >> chỉ tiện lợi khi dùng để nhập các giá trị số (nguyên, thực). Để nhập tự chuỗi tự nên dùng các phương thức sau (định nghĩa trong lớp istream): cin.get cin.getline cin.ignore 3.1. Phương thức get có 3 dạng (thực chất có 3 phương thức cùng có tên get): Dạng 1: int cin.get() ; dùng để đọc một tự (kể cả khoảng trắng). Cách thức đọc của cin.get có thể minh hoạ qua ví dụ sau: Xét các câu lệnh char ch; ch = cin.get() + Nếu gõ ABC<Enter> thì biến ch nhận mã tự A, các tự BC<Enter> còn lại trên dòng vào. + Nếu gõ A<Enter> thì biến ch nhận mã tự A, tự <Enter> còn lại trên dòng vào. + Nếu gõ <Enter> thì biến ch nhận mã tự <Enter> (bằng 10) dòng vào rỗng. Dạng 2: istream& cin.get(char &ch) ; dùng để đọc một tự (kể cả khoảng trắng) đặt vào một biến kiểu char được tham chiếu bởi ch. Chú ý: + Cách thức đọc của cin.get dạng 2 cũng giống như dạng 1 + Do cin.get() dạng 2 trả về tham chiếu tới cin, nên có thể sử dụng các phương thức get() dạng 2 nối đuôi nhau. Ví dụ 2 nếu khai báo char ch1, ch2; thì 2 câu lệnh: cin.get(ch1); cin.get(ch2); có thể viết chung trên một câu lệnh sau: cin.get(ch1).get(ch2); Dạng 3: istream& cin.get(char *str, int n, char delim = ‘\n’); 368 dùng để đọc một dẫy tự (kể cả khoảng trắng) đưa vào vùng nhớ do str trỏ tới. Quá trình đọc kết thúc khi xẩy ra một trong 2 tình huống sau: + Gặp tự giới hạn (cho trong delim). tự giới hạn mặc định là ‘\n’ (Enter) + Đã nhận đủ (n-1) tự Chú ý: + tự kết thúc chuỗi ‘\0’ được bổ sung vào dẫy tự nhận được + tự giới hạn vẫn còn lại trên dòng nhập để dành cho các lệnh nhập tiếp theo. Chú ý: + Cũng giống như get() dạng 2, có thể viết các phương thức get() dạng 3 nối đuôi nhau trên một dòng lệnh. + tự <Enter> còn lại trên dòng nhập có thể làm trôi phương thức get() dạng 3. Ví dụ xét đoạn chương trình: char ht[25], qq[20], cq[30]; cout << “\nHọ tên: “ ; cin.get(ht,25); cout << “\nQuê quán: “ ; cin.get(qq,20); cout << “\nCơ quan: “ ; cin.get(cq,30); cout <<”\n” <<ht<<” “<<qq<<” “<<cq Đoạn chương trình dùng để nhập họ tên, quê quán cơ quan. Nếu gõ: Pham Thu Huong<Enter> thì câu lệnh get đầu tiên sẽ nhận được chuỗi “Pham Thu Huong” cất vào mảng ht. tự <Enter> còn lại sẽ làm trôi 2 câu lệnh get tiếp theo. Do đó câu lệnh cuối cùng sẽ chỉ in ra Pham Thu Huong. Để khắc phục tình trạng trên, có thể dùng một trong các cách sau: + Dùng phương thức get() dạng 1 hoặc dạng 2 để lấy ra tự <Enter> trên dòng nhập trước khi dùng get (dạng 3). + Dùng phương thức ignore để lấy ra một số tự không cần thiết trên dòng nhập trước khi dùng get dạng 3. Phương thức này viết như sau: cin.ignore(n) ; // Lấy ra (loại ra hay bỏ qua) n tự trên // dòng nhập. Như vậy để có thể nhập được cả quê quán cơ quan, cần sửa lại đoạn chương trình trên như sau: char ht[25], qq[20], cq[30]; cout << “\nHọ tên: “ ; cin.get(ht,25); cin.get(); // Nhận <Enter> cout << “\nQuê quán: “ ; cin.get(qq,20); ignore(1); // Bỏ qua <Enter> cout << “\nCơ quan: “ ; cin.get(cq,30); cout <<”\n” <<ht<<” “<<qq<<” “<<cq 3.2. Phương thức getline Tương tự như get dạng 3, có thể dùng getline để nhập một dẫy tự từ bàn phím. Phương thức này được mô tả như sau: istream& cin.getline(char *str, int n, char delim = ‘\n’); Phương thức đầu tiên làm việc như get dạng 3, sau đó nó loại <Enter> ra khỏi dòng nhập (ký tự <Enter> không đưa vào dẫy tự nhận được). Như vậy có thể dùng getline để nhập nhiều chuối tự (mà không lo ngại các câu lệnh nhập tiếp theo bị trôi). Ví dụ đoạn chương trình nhập họ tên, quê quán cơ quan bên trên có thể viết như sau (bằng cách dùng getline): char ht[25], qq[20], cq[30]; cout << “\nHọ tên: “ ; cin.getline(ht,25); cout << “\nQuê quán: “ ; cin.getline(qq,20); cout << “\nCơ quan: “ ; cin.get(cq,30); cout <<”\n” <<ht<<” “<<qq<<” “<<cq Chú ý: Cũng giống như get() dạng 2 get() dạng 3, có thể viết các phương thức getline() nối đuôi nhau trên một dòng lệnh. Ví dụ đoạn chương trình trên có thể viết lại như sau: char ht[25], qq[20], cq[30]; cout << “\nHọ tên, Quê quán Cơ quan: “ ; cin.getline(ht,25).getline(qq,20).get(cq,30); cout <<”\n” <<ht<<” “<<qq<<” “<<cq 3.3. Phương thức ignore Phương thức ignore dùng để bỏ qua (loại bỏ) một số tự trên dòng nhập. Trong nhiều trường hợp, đây là việc làm cần thiết để không làm ảnh hưởng đến các phép nhập tiếp theo. Phương thức ignore được mô tả như sau: istream& cin.ignore(int n=1); Phương thức sẽ bỏ qua (loại bỏ) n tự trên dòng nhập. 3.4. Nhập đồng thời giá trị số tự Như đã nói trong § 2, toán tử nhập >> bao giờ cũng để lại tự <Enter> trên dòng nhập. tự <Enter> này sẽ làm trôi các lệnh nhập tự hoặc chuỗi tự bên dưới. Do vậy cần dùng: hoặc ignore() hoặc get() dạng 1 hoặc get() dạng 2 để loại bỏ tự <Enter> còn sót lại ra khỏi dòng nhập trước khi thực hiện việc nhập tự hoặc chuỗi tự. 370 3.5. Ví dụ: Chương trình dưới đây sử dụng lớp TSINH (Thí sinh) với 2 phương thức xuat nhap. //CT7_04.CPP // Nhập dữ liêu số tự #include <iostream.h> #include <conio.h> struct TS { int sobd; char ht[25]; float dt,dl,dh,td; } ; class TSINH { private: TS *ts; int sots; public: TSINH() { ts=NULL; sots=0; } TSINH(int n) { ts=new TS[n+1]; sots=n; } ~TSINH() { if (sots) { sots=0; ts = NULL; } } void nhap(); void xuat(); 372 } ; void TSINH::nhap() { if (sots) for (int i=1; i<=sots; ++i) { cout << "\nThi sinh "<< i << ": " ; cout << "\nSo bao danh: " ; cin >> ts[i].sobd; cin.ignore(); cout << "Ho ten: " ; cin.get(ts[i].ht,25); cout << "Diem toan, ly , hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh; ts[i].td = ts[i].dt + ts[i].dl + ts[i].dh; } } void TSINH::xuat() { if (sots) { cout << "\nDanh sach thi sinh:" ; for (int i=1; i<=sots; ++i) cout << "\nHo ten: " << ts[i].ht << " So BD: "<< ts[i].sobd <<" Tong diem: "<< ts[i].td; } } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n); t->nhap() ; t->xuat(); getch(); delete t; } . Nhập ký tự và chuỗi ký tự từ bàn phím Chúng ta nhận thấy toán tử nhập >> chỉ tiện lợi khi dùng để nhập các giá trị số (nguyên, thực). Để nhập ký. mã ký tự A, các ký tự BC<Enter> còn lại trên dòng vào. + Nếu gõ A<Enter> thì biến ch nhận mã ký tự A, ký tự <Enter> còn lại trên dòng vào.

Ngày đăng: 24/10/2013, 15:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan