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.
trang53/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   47   48   49   50   51   52   53   54   55

Các bộ và hàm định dạng


iostream.h cũng cung cấp một số bộ và hàm định dạng cho phép sử dụng tiện lợi hơn so với các cờ và các phương thức vì nó có thể được viết liên tiếp trên dòng lệnh xuất.

Các bộ định dạng


dec // tương tự ios::dec

oct // tương tự ios::dec

hex // tương tự ios::hex

endl // xuất kí tự xuống dòng ('\n')

flush // đẩy toàn bộ dữ liệu ra dòng xuất

Ví dụ :


cout.setf(ios::showbase) ; // cho phép in các kí tự biểu thị cơ số

cout.setf(ios::uppercase) ; // dưới dạng chữ viết hoa

int a = 171; int b = 32 ;

cout << hex << a << endl << b ; // in 0xAB và 0x20


Các hàm định dạng (#include )


setw(n) // tương tự cout.width(n)

setprecision(n) // tương tự cout.precision(n)

setfill(c) // tương tự cout.fill(c)

setiosflags(l) // tương tự cout.setf(l)

resetiosflags(l) // tương tự cout.unsetf(l)

IN RA MÁY IN


Như trong phần đầu chương đã trình bày, để làm việc với các thiết bị khác với màn hình và đĩa … chúng ta cần tạo ra các đối tượng (thuộc các lớp ifstream, ofstream và fstream) tức các dòng tin bằng các hàm tạo của lớp và gắn chúng với thiết bị bằng câu lệnh:

ofstream Tên_dòng(thiết bị) ;

Ví dụ để tạo một đối tượng mang tên Mayin và gắn với máy in, chúng ta dùng lệnh:



ofstream Mayin(4) ;

trong đó 4 là số hiệu của máy in.

Khi đó mọi câu lệnh dùng toán tử xuất << và cho ra Mayin sẽ đưa dữ liệu cần in vào một bộ đệm mặc định trong bộ nhớ. Nếu bộ đệm đầy, một số thông tin đưa vào trước sẽ tự động chuyển ra máy in. Để chủ động đưa tất cả dữ liệu còn lại trong bộ đệm ra máy in chúng ta cần sử dụng bộ định dạng flush (Mayin << flush << …) hoặc phương thức flush (Mayin.flush(); ). Ví dụ:

Sau khi đã khai báo một đối tượng mang tên Mayin bằng câu lệnh như trên Để in chu vi và diện tích hình chữ nhật có cạnh cd và cr ta có thể viết:

Mayin << "Diện tích HCN = " << cd * cr << endl;

Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl;

Mayin.flush();

hoặc :


Mayin << "Diện tích HCN = " << cd * cr << endl;

Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl << flush;

khi chương trình kết thúc mọi dữ liệu còn lại trong các đối tượng sẽ được tự động chuyển ra thiết bị gắn với nó. Ví dụ máy in sẽ in tất cả mọi dữ liệu còn sót lại trong Mayin khi chương trình kết thúc.

LÀM VIỆC VỚI FILE


Làm việc với một file trên đĩa cũng được quan niệm như làm việc với các thiết bị khác của máy tính (ví dụ như làm việc với máy in với đối tượng Mayin trong phần trên hoặc làm việc với màn hình với đối tượng chuẩn cout). Các đối tượng này được khai báo thuộc lớp ifstream hay ofstream tùy thuộc ta muốn sử dụng file để đọc hay ghi.

Như vậy, để sử dụng một file dữ liệu đầu tiên chúng ta cần tạo đối tượng và gắn cho file này. Để tạo đối tượng có thể sử dụng các hàm tạo có sẵn trong hai lớp ifstream và ofstream. Đối tượng sẽ được gắn với tên file cụ thể trên đĩa ngay trong quá trình tạo đối tượng (tạo đối tượng với tham số là tên file) hoặc cũng có thể được gắn với tên file sau này bằng câu lệnh mở file. Sau khi đã gắn một đối tượng với file trên đĩa, có thể sử dụng đối tượng như đối với Mayin hoặc cin, cout. Điều này có nghĩa trong các câu lệnh in ra màn hình chỉ cần thay từ khóa cout bởi tên đối tượng mọi dữ liệu cần in trong câu lệnh sẽ được ghi lên file mà đối tượng đại diện. Cũng tương tự nếu thay cin bởi tên đối tượng, dữ liệu sẽ được đọc vào từ file thay cho từ bàn phím. Để tạo đối tượng dùng cho việc ghi ta khai báo chúng với lớp ofstream còn để dùng cho việc đọc ta khai báo chúng với lớp ifstream.


Tạo đối tượng gắn với file


Mỗi lớp ifstream và ofstream cung cấp 4 phương thức để tạo file. Ở đây chúng tôi chỉ trình bày 2 cách (2 phương thức) hay dùng.

Cách 1: đối_tượng;



đối_tượng.open(tên_file, chế_độ);

Lớp là một trong hai lớp ifstream và ofstream. Đối tượng là tên do NSD tự đặt. Chế độ là cách thức làm việc với file (xem dưới). Cách này cho phép tạo trước một đối tượng chưa gắn với file cụ thể nào. Sau đó dùng tiếp phương thức open để đồng thời mở file và gắn với đối tượng vừa tạo.

Ví dụ:

ifstream f; // tạo đối tượng có tên f để đọc hoặc



ofstream f; // tạo đối tượng có tên f để ghi

f.open("Baitap"); // mở file Baitap và gắn với f

Cách 2: đối_tượng(tên_file, chế_độ)

Cách này cho phép đồng thời mở file cụ thể và gắn file với tên đối tượng trong câu lệnh.

Ví dụ:

ifstream f("Baitap"); // mở file Baitap gắn với đối tượng f để



ofstream f("Baitap); // đọc hoặc ghi.

Sau khi mở file và gắn với đối tượng f, mọi thao tác trên f cũng chính là làm việc với file Baitap.

Trong các câu lệnh trên có các chế độ để qui định cách thức làm việc của file. Các chế độ này gồm có:

ios::binary : quan niệm file theo kiểu nhị phân. Ngầm định là kiểu văn bản.

ios::in : file để đọc (ngầm định với đối tượng trong ifstream).

ios::out : file để ghi (ngầm định với đối tượng trong ofstream), nếu file đã có trên đĩa thì nội dung của nó sẽ bị ghi đè (bị xóa).ios::app : bổ sung vào cuối file

ios::trunc : xóa nội dung file đã có

ios::ate : chuyển con trỏ đến cuối file

ios::nocreate : không làm gì nếu file chưa có

ios::replace : không làm gì nếu file đã có

có thể chỉ định cùng lúc nhiều chế độ bằng cách ghi chúng liên tiếp nhau với toán tử hợp bit |. Ví dụ để mở file bài tập như một file nhị phân và ghi tiếp theo vào cuối file ta dùng câu lệnh:

ofstream f("Baitap", ios::binary | ios::app);


Đóng file và giải phóng đối tượng


Để đóng file được đại diện bởi f, sử dụng phương thức close như sau:

đối_tượng.close();

Sau khi đóng file (và giải phóng mối liên kết giữa đối tượng và file) có thể dùng đối tượng để gắn và làm việc với file khác bằng phương thức open như trên.

: Đọc một dãy số từ bàn phím và ghi lên file. File được xem như file văn bản (ngầm định), các số được ghi cách nhau 1 dấu cách.

#include

#include

#include

void main()

{

ofstream f; // khai báo (tạo) đối tượng f



int x;

f.open("DAYSO"); // mở file DAYSO và gắn với f

for (int i = 1; i<=10; i++) {

cin >> x;

f << x << ' ';

}

f.close();



}

: Chương trình sau nhập danh sách sinh viên, ghi vào file 1, đọc ra mảng, sắp xếp theo tuổi và in ra file 2. Dòng đầu tiên trong file ghi số sinh viên, các dòng tiếp theo ghi thông tin của sinh viên gồm họ tên với độ rộng 24 kí tự, tuổi với độ rộng 4 kí tự và điểm với độ rộng 8 kí tự.

#include

#include

#include

#include

#include

#include

#include

struct Sv {

char *hoten;

int tuoi;

double diem;

};

class Sinhvien {



int sosv ;

Sv *sv;


public:

Sinhvien() {

sosv = 0;

sv = NULL;

}

void nhap();



void sapxep();

void ghifile(char *fname);

};
void Sinhvien::nhap()

{

cout << "\nSố sinh viên: "; cin >> sosv;



int n = sosv;

sv = new Sinhvien[n+1]; // Bỏ phần tử thứ 0

for (int i = 1; i <= n; i++) {

cout << "\nNhập sinh viên thứ: " << i << endl;

cout << "\nHọ tên: "; cin.ignore(); cin.getline(sv[i].hoten);

cout << "\nTuổi: "; cin >> sv[i].tuoi;

cout << "\nĐiểm: "; cin >> sv[i].diem;

}

}


void Sinhvien::ghi(char fname)

{

ofstream f(fname) ;



f << sosv;

f << setprecision(1) << setiosflags(ios::showpoint) ;

for (int i=1; i<=sosv; i++) {

f << endl << setw(24) << sv[i].hoten << setw(4) << tuoi;

f << setw(8) << sv[i].diem;

}

f.close();



}

void Sinhvien::doc(char fname)

{

ifstream f(fname) ;



f >> sosv;

for (int i=1; i<=sosv; i++) {

f.getline(sv[i].hoten, 25);

f >> sv[i].tuoi >> sv[i].diem;

}

f.close();



}
void Sinhvien::sapxep()

{

int n = sosv;



for (int i = 1; i < n; i++) {

for (int j = j+1; j <= n; j++) {

if (sv[i].tuoi > sv[j].tuoi) {

Sinhvien t = sv[i]; sv[i] = sv[j]; sv[j] = t;

}

}
void main() {



clrscr();

Sinhvien x ;

x.nhap(); x.ghi("DSSV1");

x.doc("DSSV1"); x.sapxep(); x.ghi("DSSV2");

cout << "Đã xong";

getch();


}
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