Kết xuất dƣ̃ liê ̣u với cout

Một phần của tài liệu Bài giảng - Lập trình hướng đối tượng và C++ pdf (Trang 40 - 43)

Chúng ta đã từng sử dụng đối t ượng cout cho việc kết xuất dữ liệu ra màn hình , ngoài ra chúng ta cũng có thể sử dụng cout để định dạng dữ liệu , căn lề các dòng kết xuất dữ liê ̣u và ghi dữ liê ̣u kiểu số dưới da ̣ng số thâ ̣p phân hay hê ̣ hexa.

Xóa bộ đệm ouput

Viê ̣c xóa bô ̣ đê ̣m output được thực hiê ̣n khi chúng ta go ̣i tới hàm endl . Hàm này thực chất là go ̣i tới hàm flush () của đối tượng cout . Chúng ta có thể gọi trức tiếp tới hàm này:

cout << flush;

Các hàm liên quan

Tương tự như cin có các hàm get () và getline() cout có các hàm put () và write() phục vụ cho việc kết xuất dữ liệu . Hàm put() đươ ̣c dùng để ghi mô ̣t ký tự ra thiết bi ̣ output và cũng như hàm get() của cin chúng ta có thể dùng hàm này liên tiếp:

cout.put(„a‟).put(„e‟);

Hàm write làm việc giống hệt như toán tử chèn chỉ trừ một điều là nó các hai tham số: tham số thứ nhất là con trỏ xâu và tham số thứ hai là số ký tự sẽ in ra, ví dụ:

char str[] = “no pain no gain”; cout.write(str,3);

38

Các chỉ thị định dạng, các cờ và các thao tác với cout

Dòng output có rất nhiều cờ được sử dụng vào các mục đích khác nhau chẳng hạn như quản lý cơ số của các biến sẽ được kết xuất ra màn hì nh, kích thước của các trường… Mỗi cờ tra ̣ng thái là mô ̣t byte có các bit được gán cho các ý nghĩa khác nhau , các cờ này có thể được đặt các giá trị khác nhau bằng cách sử dụng các hàm .

Sử du ̣ng hàm width của đối tượng cout

Độ rộng mặc định khi in ra các biến là vừa đủ để in dữ liệu của biến đó , điều này đôi khi làm cho output nhâ ̣n được không đe ̣p về mă ̣t thẩm mỹ . Để thay đổi điều này chúng ta có thể dùng hàm width, ví dụ:

cout.width(5);

Nếu như đô ̣ rô ̣ng thiết lâ ̣p bằng hàm width nhỏ hơn đô ̣ rô ̣ng của biến trên thực tế thì nó sẽ không có tác dụng.

Thiết lâ ̣p các ký tƣ̣ lấp chỗ trống

Bình thường cout lấp các chỗ trống khi in ra một biến nào đó (vớ i đô ̣ rô ̣ng đươ ̣c thiết lâ ̣p bằng hàm width) bằng các dấu trống, nhưng chúng ta có thể thay đổi điều này bằng cách go ̣i tới hàm fill, ví dụ:

cout.fill(„*‟);

Thiết lâ ̣p các cờ

Các đối tượng iostream quản lý trạng thái của chúng bằn g cách sử du ̣ng các cờ . Chúng ta có thể thiết lập các cờ này bằng cách sử dụng hàm setf () với tham số là mô ̣t hằng kiểu liê ̣t kê đã được đi ̣nh nghĩa trước . Chẳng ha ̣n với mô ̣t biến kiểu float có giá trị là 20.000, nếu chúng ta sử du ̣ng toán tử >> để in ra màn hình kết quả nhận được sẽ là 20, nếu chúng ta thiết lâ ̣p cờ showpoint kết quả sẽ là 20.000.

Sau đây là mô ̣t số cờ thường dùng:

Showpos dấu của các biến kiểu số Hex In ra số dưới da ̣ng hexa Dec In ra số dưới da ̣ng cơ số 10 Oct In ra số dưới da ̣ng cơ số 8 Left Căn lề bên trái Right Căn lề bên phải Internal Căn lề giữa

Precision Hàm thiết lập độ chính xác của các biến thực: cout.precision(2);

Ngoài ra còn p hải kể đến hàm setw () cũng có thể đƣợc dùng thay cho hàm width.

Chú ý là các hàm trên đều cần có chỉ thị include file header iomanip .h.

Các hàm width, fill và precision đều có mô ̣t phiên bản không có tham số cho phép đo ̣c các giá trị được thiết lập hiện tại (mă ̣c đi ̣nh).

8. Các dòng vào ra và hàm printf

Hầu hết các cài đă ̣t của C ++ đều cung cấp các thư viện C chuẩn , trong đó bao gồm lê ̣nh printf (). Mă ̣c dù về mă ̣t nào đó hàm prinf dễ sử du ̣ng hơn so vớ i các dòng của C++ nhưng nó không thể theo ki ̣p đươ ̣c các dòng : hàm printf không có đảm bảo về kiểu dữ liê ̣u do đó khi chúng ta in ra mô ̣t ký tự la ̣i có thể là mô ̣t số nguyên và ngược lại, hàm printf cũng không hỗ trợ các lớp do đó không thể overload để làm viê ̣c với các lớp.

39

Ngoài ra hàm printf cũng thực hiện việc định dạng dữ liệu dễ dàng hơn, ví dụ: printf(“%15.5f”, tf); (adsbygoogle = window.adsbygoogle || []).push({});

Có rất nhiều lập trình viên C ++ có xu hướng thích dùng hàm printf () nên cần phải chú ý kỹ tới hàm này.

9. Vào ra dữ liệu với các file

Các dòng cung cấp cho chúng ta một cách nhất quán để làm việc với dữ liệu được nhâ ̣p vào từ bàn phím cũng như dữ liê ̣u được nhâ ̣p vào từ các file . Để làm viê ̣c với các file chúng ta ta ̣o ra các đối tượng ofstream và ifstream.

ofstream

Các đối tượng cụ thể mà chúng ta dùng để đọc dữ liệu ra hoặc ghi dữ liệu vào được gọi là các đối tượng ofstream. Chúng được kế thừa từ các đối tươ ̣ng iostream.

Để làm viê ̣c với mô ̣t file trước hết chúng ta cần ta ̣o ra mô ̣t đối tượng ofstream , sau đó gắn nó với mô ̣t file cu ̣ thể trên đĩa , và để tạo ra một đối tượng ofstream chúng ta cần include file fstream.h.

Các trạng thái điều kiê ̣n

Các đối tượng iostream quản lý các cờ báo hiệu trạng thái sau khi chúng ta thực hiê ̣n các thao tác input và output chúng ta có thể kiểm tra các cờ này bằng cách sử dụng các hàm Boolean chẳng hạn như eof (), bad(), fail(), good(). Hàm bad() cho giá tri ̣ TRUE nếu mô ̣t thao tác là không hợp lê ̣ , hàm fail () cho giá tri ̣ TRUE nếu như hàm bad() cho giá tri ̣ TRUE hoă ̣c mô ̣t thao tác nào đó thất ba ̣i . Cuối cùng hàm good () cho giá trị TRUE khi và chỉ khi tất cả 3 hàm trên đều trả về FALSE.

Mở file

Để mở mô ̣t file cho viê ̣c kết xuất dữ liê ̣u chúng ta ta ̣o ra mô ̣t đối tượng ofstream : ofstream fout(“out.txt”);

và để mở file nhập dữ liệu cũng tương tự: ifstream fin(“inp.txt”);

Sau khi ta ̣o ra các đối tượng này chúng ta có thể dùng chúng giống như các thao tác vẫn đươ ̣c thực hiê ̣n với cout và cin nhưng cần chú ý có hàm close () trước khi kết thúc chương trình. Ví dụ: ifstream fin(“data.txt”); while(fin.get(ch)) cout << ch; fin.close();

Thay đổi thuô ̣c tính mă ̣c đi ̣nh khi mở file

Khi chúng ta mở mô ̣t file để kết xuất dữ liê ̣u qua mô ̣t đối tượng ofstream , nếu file đó đã tồn ta ̣i nô ̣i dung của nó sẽ bi ̣ xóa bỏ còn nếu nó không tồn t ại thì file mới sẽ đươ ̣c ta ̣o ra . Nếu chúng ta muốn thay đổi các hành đô ̣ng mă ̣c đi ̣nh này có thể truyền thêm mô ̣t biến tường minh vào cấu tử của lớp ofstream.

Các tham số hợp lệ có thể là:

ios::app – append, mở rô ̣ng nô ̣i dung mô ̣t file nếu nó đã có sẵn.

ios:ate -- đặt vi ̣ trí vào cuối file nhưng có thể ghi lên bất cứ vi ̣ trí nào trong file ios::trunc -- mặc đi ̣nh

ios::nocreate -- nếu file không có sẵn thao tác mở file thất ba ̣i ios::noreplace -- Nếu file đã có sẵn thao tác mở file thất ba ̣i.

Chú ý : nên kiểm tra khi thực hiê ̣n mở mô ̣t file bất kỳ . Nên sử du ̣ng la ̣i các đối tươ ̣ng ifstream và ofstream bằng hàm open().

40

Một phần của tài liệu Bài giảng - Lập trình hướng đối tượng và C++ pdf (Trang 40 - 43)