Diễn Đàn Teen Việt -Thế Giới 9x pro
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

giáo trình ngôn ngữ lập trinh C ++ <phần 5>

Go down

giáo trình ngôn ngữ lập trinh C ++ <phần 5> Empty giáo trình ngôn ngữ lập trinh C ++ <phần 5>

Bài gửi by luongbv93 25th November 2011, 09:30

CHƯƠNG 4

VÀO RA TRÊN TỆP

Nội dung chương này tập trung trình bày các vấn đề liên quan đến các thao tác trên tệp dữ liệu
trong ngôn ngữ C++:

• Khái niệm tệp, tệp văn bản và tệp nhị phân

• Các thao tác vào ra trên tệp

• Phương thức truy nhập tệp trực tiếp

4.1 KHÁI NIỆM TỆP

4.1.1 Tệp dữ liệu

Trong C++, khi thao tác với một tệp dữ liệu, cần thực hiện tuần tự theo các bước như sau:

1. Mở tệp tin

2. Thực hiện các thao tác đọc, ghi trên tệp tin đang mở

3. Đóng tệp tin

Để thực hiện các thao tác liên quan đến tệp dữ liệu, C++ cung cấp một thư viện <fstream.h>
chứa các lớp và các hàm phục vụ cho các thao tác này. Do vậy, trong các chương trình làm việc
với tệp tin, ta cần khai báo chỉ thị dùng thư viện này ngay từđầu chương trình:

#include<fstream.h>

Khai báo biến tệp

Trong C++, khi khai báo một biến tệp, đồng thời ta sẽ mở tệp tương ứng theo cú pháp tổng quát
bằng cách dùng kiểu fstream như sau:

fstream <Tên biến tệp>(<Tên tệp>, <Chế độ mở tệp>);

Trong đó:

• Tên biến tệp: có tính chất như một tên biến thông thường, nó sẽđược dùng để thực hiện
các thao tác với tệp gắn với nó. Tên biến tệp cũng phải tuân thủ theo quy tắc đặt tên biến
trong C++.

• Tên tệp: là tên tệp dữ liệu mà ta cần thao tác trên nó.

• Chếđộ mở tệp: là các hằng kiểu bít đã được định nghĩa sẵn bởi C++. Nó chỉ ra rằng ta
đang mở tệp tin ở chếđộ nào: đọc hoặc ghi, hoặc cảđọc lẫn ghi.

Ví dụ, khai báo:

fstream myFile(“abc.txt”, ios::in);

là khai báo một biến tệp, có tên là myFile, dùng để mở tệp tin có tên là abc.txt và tệp tin này được
mởở chếđộđểđọc dữ liệu (bít chỉ thị ios::in).

Lưu ý: • Tên tệp tin có dạng một chuỗi kí tự, nếu khai báo tên tệp có đường dẫn thư mục “\” thì
mỗi dấu “\” phải được viết thành “\\” để tránh bị nhầm lẫn với các kí tựđặc biệt trong C
như “\n”, “\d”…

Ví dụ, muốn mở một tệp tên là abc.txt trong thư mục myDir đểđọc, ta phải khai báo như sau:

fstream myFile(“myDir\\abc.txt”, ios::in);

Các chếđộ mở tệp tin

Các chếđộ mở tệp tin được định nghĩa bởi các bít chỉ thị:

• ios::in: Mở một tệp tin đểđọc.

• ios::out: Mở một tệp tin có sẵn để ghi.

• ios::app: Mở một tệp tin có sẵn để thêm dữ liệu vào cuối tệp.

• ios::ate: Mở tệp tin và đặt con trỏ tệp tin vào cuối tệp.

• ios::trunc: Nếu tệp tin đã có sẵn thì dữ liệu của nó sẽ bị mất.

• ios::nocreate: Mở một tệp tin, tệp tin này bắt buộc phải tồn tại.

• ios::noreplace: Chỉ mở tệp tin khi tệp tin chưa tồn tại.

• ios::binary: Mở một tệp tin ở chếđộ nhị phân.

• ios::text: Mở một tệp tin ở chếđộ văn bản.

Lưu ý:

• Khi muốn mở một tệp tin đồng thời ở nhiều chếđộ khác nhau, ta kết hợp các bít chỉ thị
tương ứng bằng phép toán hợp bít “|”.

Ví dụ, muốn mở một tệp tin abc.txt đểđọc (ios::in) đồng thời với để ghi (ios::out) dưới chếđộ văn
bản (ios::text), ta khai báo như sau:
4.2 VÀO RA TRÊN TỆP

4.2.1 Vào ra tệp văn bản bằng “>>” và “<<”

Ghi tệp v ăn bản bằng “<<”

Các bước thực hiện để ghi dữ liệu vào một tệp tin như sau:

1. Mở tệp tin theo chếđộđể ghi bằng đối tượng ofstream (mở tệp tin chỉđể ghi):

ofstream <Tên biến tệp>(<Tên tệp tin>, ios::out);

2. Ghi dữ liệu vào tệp bằng thao tác “<<”:

<Tên biến tệp> << <Dữ liệu>;

3. Đóng tệp tin bằng lệnh close():

<Tên biến tệp>.close();

Chương trình 4.1 minh hoạ việc ghi dữ liệu vào tệp tin:

• Tên tệp tin được người dùng tự nhập vào từ bàn phím.

• Chương trình sẽ ghi vào tệp các kí tự do người dùng gõ vào từ bàn phím, mỗi kí tựđược
phân cách nhau bởi dấu trống (space bar).

• Chương trình dừng lại khi người dùng nhập kí tự ‘e’. Và tệp tin được kết thúc bằng một
dấu xuống dòng “endl”.

Chương trình 4.1

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char fileName[length], input;

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin

/* Mở tệp tin */

ofstream fileOut(fileName, ios::out);// Khai báo và mở tệp tin

if(!fileOut){ // Không mở được tệp

cout << “Khong the tao duoc tep tin ” << fileName << endl;

exit(1);

}

/* Ghi dữ liệu vào tệp tin */

do{

cin >> input; // Đọc kí tự từ bàn phím

fileOut << input << ‘ ‘; // Ghi kí tự vào tệp tin

}while((input != ‘e’)&&(fileOut));

fileOut << endl; // Xuống dòng cuối tệp tin

/* Đóng tệp tin */

fileOut.close(); // Đóng tệp tin

return;

}

Đọc dữ liệu từ tệp v ăn bản bằng “>>”

Các bước thực hiện đểđọc dữ liệu từ một tệp tin như sau:

1. Mở tệp tin theo chếđộđểđọc bằng đối tượng ifstream (mở tệp tin chỉđểđọc):

ifstream <Tên biến tệp>(<Tên tệp tin>, ios::in);

2. Đọc dữ liệu từ tệp bằng thao tác “>>”:

<Tên biến tệp> >> <Biến dữ liệu>;

3. Đóng tệp tin bằng lệnh close():

<Tên biến tệp>.close();

Chương trình 4.2 minh hoạ việc đọc dữ liệu từ tệp tin vừa sử dụng trong chương trình 4.1 ra màn
hình:

• Tên tệp tin được người dùng tự nhập vào từ bàn phím.

• Chương trình sẽđọc các kí tự trong tệp và hiển thị ra màn hình, mỗi kí tựđược phân cách
nhau bởi dấu trống (space bar).

• Chương trình dừng lại khi kết thúc tệp tin.

Chương trình 4.2

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char fileName[length], output;

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin

/* Mở tệp tin */
ifstream fileIn(fileName, ios::in); // Khai báo và mở tệp tin

if(!fileIn){ // Không mở được tệp

cout << “Khong the mo duoc tep tin ” << fileName << endl;

exit(1);

}

/* Đọc dữ liệu từ tệp tin ra màn hình */

while(fileIn){

fileIn >> output; // Đọc kí tự từ tệp tin

cout << output; // Ghi kí tự ra màn hình

}

cout << endl; // Xuống dòng trên màn hình

/* Đóng tệp tin */

fileIn.close(); // Đóng tệp tin

return;

}

Chương trình 4.3 minh hoạ việc copy toàn bộ nội dung của một tệp tin sang một tệp tin mới:

• Tên tệp tin nguồn và tệp tin đích được nhập từ bàn phím bởi người dùng.

• Tệp tin nguồn được mởở chếđộđọc.

• Tệp tin đích được mởở chếđộ ghi.

• Đọc từng kí tự từ tệp tin nguồn và ghi ngay vào tệp tin đích.

• Đóng các tệp tin khi kết thúc.

Chương trình 4.3

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char sourceFile[length], targetFile[length], data;

cout << “Ten tep tin nguon: ”;

cin >> setw(length) >> sourceFile; // Nhập tên tệp tin nguồn

cout << “Ten tep tin dich: ”;

cin >> setw(length) >> targetFile; // Nhập tên tệp tin đích
/* Mở tệp tin nguồn */

ifstream fileIn(sourceFile, ios::in);// Khai báo và mở tệp nguồn

if(!fileIn){ // Không mở được tệp nguồn

cout << “Khong the mo duoc tep tin nguon ”

<< sourceFile << endl;

exit(1);

}

/* Mở tệp tin đích */

ofstream fileOut(targetFile, ios::out);// Khai báo và mở tệp đích

if(!fileOut){ // Không mở được tệp đích

cout << “Khong the tao duoc tep tin dich ”

<< targetFile << endl;

exit(1);

}

/* Đọc dữ liệu từ tệp tin ra tệp đích */

while(fileIn){

fileIn >> data; // Đọc kí tự từ tệp nguồn

fileOut << data; // Ghi kí tự ra tệp đích

}

/* Đóng các tệp tin */

fileIn.close(); // Đóng tệp tin nguồn

fileOut.close(); // Đóng tệp tin đích

return;

}

Lưu ý:

• Tên biến tệp, sau khi dùng xong với một tệp xác định, có thể sử dụng để mở một tệp khác,
với một chếđộ mở tệp khác bằng phép toán open() của biến tệp.

<Tên biến tệp>.open(<Tên tệp mới>, <chế độ mở mới>);

Ví dụ, đoạn chương trình:

ofstream myFile(“abc.txt”, ios::out);

… // ghi vao file abc.txt

myFile.close();

myFile.open(“xyz.txt”, ios::out|ios::app);

… // Them vao cuoi file xyz.txt

myFile.close();

sẽ dùng biến tệp myFile (có kiểu ofstream) hai lần: một lần là dùng với tệp tin abc.txt ở chếđộ mở
để ghi từđầu. Một lần khác là với tệp tin xyz.txt ở chếđộ mởđể ghi thêm vào cuối.
4.2.2 Vào ra tệp nhị phân bằng read và write

Ghi vào tệp nhị phân bằng write

Các bước thực hiện để ghi dữ liệu vào một tệp nhị phân như sau:

1. Mở tệp tin theo chếđộđể ghi nhị phân bằng đối tượng fstream:

fstream <Tên biến tệp>(<Tên tệp tin>, ios::out|ios::binary);

2. Ghi dữ liệu vào tệp bằng thao tác “write()”:

<Tên biến tệp>.write(char* <Dữ liệu>,

int <Kích thước dữ liệu>);

3. Đóng tệp tin bằng lệnh close():

<Tên biến tệp>.close();

Trong đó, thao tác write nhận hai tham sốđầu vào như sau:

• Tham số thứ nhất là con trỏ kiểu char trỏđến vùng dữ liệu cần ghi vào tệp. Vì con trỏ bắt
buộc có kiểu char nên khi muốn ghi dữ liệu có kiểu khác vào tệp, ta dùng hàm chuyển
kiểu:

reinterpret_cast<char *>(<Dữ liệu>);

• Tham số thứ hai là kích cỡ dữ liệu được ghi vào tệp. Kích cỡ này được tính theo byte, nên
thông thường ta dùng toán tử:

sizeof(<Kiểu dữ liệu>);

Lưu ý:

• Khi muốn đọc, ghi các dữ liệu có cấu trúc (struct) vào tệp thì ta phải dùng ở chếđộ
đọc/ghi tệp nhị phân mà không thể dùng chếđộđọc/ghi ở chếđộ văn bản.

• Khi đọc/ghi dữ liệu có kiểu cấu trúc, để toán tử sizeof() thực hiện chính xác thì các thành
viên của cấu trúc không được là kiểu con trỏ. Vì toán tử sizeof() đối với con trỏ chỉ cho
kích cỡ của con trỏ mà không cho kích cỡ thật của vùng dữ liệu mà con trỏ trỏ tới.

Chương trình 4.4 minh hoạ việc ghi dữ liệu vào tệp tin nhị phân, dữ liệu là kiểu cấu trúc:

• Tên tệp tin và số lượng bản ghi được người dùng tự nhập vào từ bàn phím.

• Chương trình sẽ ghi vào tệp các bản ghi có cấu trúc do người dùng gõ vào từ bàn phím.

Chương trình 4.4

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

#include<type.h>

const int length = 25; // Độ dài tối đa tên tệp tin

typedef struct {

int day; // Ngày

int month; // Tháng
int year; // Năm

} Date;

typedef struct {

char name[20]; // Tên nhân viên

Date birthDay; // Ngày sinh của nhân viên

char role[20]; // Chức vụ của nhân viên

float salary; // Lương của nhân viên

} Employee;

void main(){

clrscr();

char fileName[length]; // Tên tệp tin

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin

int recordNumber; // Số lượng bản ghi

cout << “So luong ban ghi: ”;

cin >> recordNumber; // Nhập số lượng bản ghi

/* Mở tệp tin */

// Khai báo và mở tệp tin

fstream fileOut(fileName, ios::out|ios::binary);

if(!fileOut){ // Không mở được tệp

cout << “Khong the tao duoc tep tin ” << fileName << endl;

exit(1);

}

/* Ghi dữ liệu vào tệp tin */

Employee myEmployee;

for(int i=0; i<recordNumber; i++){

cout << “Ban ghi thu ” << i+1 << endl;

cout << “Name: ”;

cin >> myEmployee.name; // Nhập tên nhân viên

cout << “Day of birth: ”;

cin >> myEmployee.birthDay.day;// Nhập ngày sinh

cout << “Month of birth: ”;

cin >> myEmployee.birthDay.month;// Nhập tháng sinh

cout << “Year of birth: ”;

cin >> myEmployee.birthDay.year;// Nhập năm sinh

cout << “Role: ”;

cin >> myEmployee.role; // Nhập chức vụ

cout << “Salary: ”;
cin >> myEmployee.salary; // Nhập tiền lương

// Ghi dữ liệu vào tệp

fileOut.write(reinterpret_cast<char *>(&myEmployee),

sizeof(Employee));

}

/* Đóng tệp tin */

fileOut.close(); // Đóng tệp tin

return;

}

Đọc dữ liệu từ tệp nhị phân bằng read

Các bước thực hiện đểđọc dữ liệu từ một tệp tin nhị phân như sau:

1. Mở tệp tin theo chếđộđểđọc nhị phân bằng đối tượng fstream (mở tệp tin chỉđể ghi):

fstream <Tên biến tệp>(<Tên tệp tin>, ios::in|ios::binary);

2. Đọc dữ liệu từ tệp bằng thao tác “read()”:

<Tên biến tệp>.read(char* <Dữ liệu ra>,

int <Kích thước dữ liệu>);

3. Đóng tệp tin bằng lệnh close():

<Tên biến tệp>.close();

Chương trình 4.5 minh hoạ việc đọc dữ liệu từ tệp tin vào biến có cấu trúc:

• Tên tệp tin được người dùng tự nhập vào từ bàn phím.

• Chương trình sẽđọc các cấu trúc nhân viên trong tệp và hiển thị ra màn hình.

• Chương trình dừng lại khi kết thúc tệp tin.

Chương trình 4.5

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

#include<type.h>

const int length = 25; // Độ dài tối đa tên tệp tin

typedef struct {

int day; // Ngày

int month; // Tháng

int year; // Năm

} Date;
typedef struct {

char name[20]; // Tên nhân viên

Date birthDay; // Ngày sinh của nhân viên

char role[20]; // Chức vụ của nhân viên

float salary; // Lương của nhân viên

} Employee;

void main(){

clrscr();

char fileName[length]; // Tên tệp tin

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin

/* Mở tệp tin */

// Khai báo và mở tệp tin

fstream fileIn(fileName, ios::in|ios::binary);

if(!fileIn){ // Không mở được tệp

cout << “Khong the mo duoc tep tin ” << fileName << endl;

exit(1);

}

/* Đọc dữ liệu từ tệp tin ra màn hình */

Employee myEmployee;

while(fileIn){

fileIn.read(reinterpret_cast<char *>(&myEmployee),

sizeof(Employee)); // Đọc kí tự từ tệp tin

cout << myEmployee.name << “ ”

<< myEmployee.birthDay.day << “/”

<< myEmployee.birthDay.month << “/”

<< myEmployee.birthDay.year << “ ”

<< myEmployee.role << “ ”

<< myEmployee.salary << endl; // Ghi kí tự ra màn hình

}

/* Đóng tệp tin */

fileIn.close(); // Đóng tệp tin

return;

}
4.3 TRUY NHẬP TỆP TRỰC TIẾP

4.3.1 Con trỏ tệp tin

Con trỏ tệp tin có vai trò như một đầu đọc trỏ vào một vị trí xác định của tệp và thao tác truy nhập
tệp diễn ra tuần tự:

• Tại mỗi thời điểm, con trỏ tệp tin xác định một vị trí trên tệp mà tại đó, thao tác truy nhập
tệp (đọc/ghi) được thực hiện.

• Sau thao tác truy nhập, con trỏ tệp tựđộng chuyển đến vị trí tiếp theo dựa vào kích thước
đơn vị dữ liệu được truy nhập.

Cách truy nhập tệp tuần tự có nhược điểm là bao giờ cũng phải bắt đầu từđầu tệp tin, đi tuần tự
cho đến vị trí cần truy nhập. Khi tệp tin có kích thước lớn thì cách truy nhập này rất tốn thời gian.

Để tránh nhược điểm này, C++ cho phép truy nhập trực tiếp đến một vị trí xác định trên tệp tin
bằng các phép toán:

• Truy nhập vị trí hiện tại của con trỏ tệp tin

• Dịch chuyển con trỏ tệp tin đến một vị trí xác định

4.3.2 Truy nhập vị trí hiện tại của con trỏ tệp

Cú pháp truy nhập đến vị trí hiện thời của con trỏ tệp phụ thuộc vào kiểu biến tệp đang dùng là để
đọc hay ghi.

• Nếu biến tệp là kiểu mở tệp đểđọc ifstream thì cú pháp là:

<Tên biến tệp>.tellg();

• Nếu biến tệp là kiểu mở tệp để ghi ofstream thì cú pháp là:

<Tên biến tệp>.tellp();

Chương trình 4.6a minh hoạ việc xác định vị trí hiện thời của con trỏ tệp sau một số thao tác đọc
tệp trước đó.

Chương trình 4.6a

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char fileName[length], output;

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin
/* Mở tệp tin */

ifstream fileIn(fileName, ios::in); // Khai báo và mở tệp tin

if(!fileIn){ // Không mở được tệp

cout << “Khong the mo duoc tep tin ” << fileName << endl;

exit(1);

}

/* Đọc dữ liệu từ tệp tin ra màn hình

* Ghi vi trí con trỏ tệp ra màn hình cứ sau 5 lần đọc kí tự */

int index = 0;

while(fileIn){

fileIn >> output; // Đọc kí tự từ tệp tin

cout << output; // Ghi kí tự ra màn hình

if(index % 5 == 0) // Ghi ra vị trí con trỏ tệp

cout<< endl << “Vi tri con tro tep: ”

<< fileIn.tellg() << endl;

index ++;

}

cout << endl; // Xuống dòng trên màn hình

/* Đóng tệp tin */

fileIn.close(); // Đóng tệp tin

return;

}

Chương trình 4.6b minh hoạ việc xác định vị trí hiện thời của con trỏ tệp sau một số thao tác ghi
vào tệp trước đó.

Chương trình 4.6b

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char fileName[length], input;

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin
/* Mở tệp tin */

ofstream fileOut(fileName, ios::out);// Khai báo và mở tệp tin

if(!fileOut){ // Không mở được tệp

cout << “Khong the tao duoc tep tin ” << fileName << endl;

exit(1);

}

/* Ghi dữ liệu vào tệp tin

* Hiện ra màn hình vị trí con trỏ tệp sau khi ghi đuọc 5 kí tự*/

int index = 0;

do{

cin >> input; // Đọc kí tự từ bàn phím

fileOut << input << ‘ ‘; // Ghi kí tự vào tệp tin

if(index%5 == 0) // Hiển thị vị trí con trỏ tệp

cout << ”Vi tri con tro tep: ”

<< fileOut.tellp() << endl;

index++;

}while((input != ‘e’)&&(fileOut));

fileOut << endl; // Xuống dòng cuối tệp tin

/* Đóng tệp tin */

fileOut.close(); // Đóng tệp tin

return;

}

4.3.3 Dịch chuyển con trỏ tệp

Ngoài việc xác định vị trí hiện thời của con trỏ tệp, C++ còn cho phép dịch chuyển con trỏ tệp đến
một vị trí bất kì trên tệp. Cú pháp dịch chuyển phụ thuộc vào kiểu biến tệp là đọc hay ghi.

• Nếu biến tệp có kiểu là mở tệp tin đểđọc ifstream, cú pháp sẽ là:

<Tên biến tệp>.seekg(<Kích thước>, <Mốc dịch chuyển>);

• Nếu biến tệp có kiểu là mở tệp để ghi ofstream, cú pháp sẽ là:

<Tên biến tệp>.seekp(<Kích thước>, <Mốc dịch chuyển>);

Trong đó:

• Kích thước: là tham số mô tả khoảng cách dịch chuyển so với vị trí mốc dịch chuyển.
Đơn vị tính của kích thước là byte, có kiểu là số nguyên.

• Mốc dịch chuyển: là vị trí gốc để xác định khoảng cách dịch chuyển của con trỏ tệp. Có
ba tham số hằng về kiểu mốc dịch chuyển:

- ios::beg: Mốc dịch chuyển là đầu tệp tin.

- ios::cur: Mốc dịch chuyển là vị trí hiện thời của con trỏ tệp.

- ios::end: Mốc dịch chuyển là vị trí cuối cùng của tệp tin.
Ví dụ:

ifstream fileIn(“abc.txt”, ios::in);

fileIn.seekg(sizeof(char)*7, ios::beg);

sẽ dịch chuyển con trỏ tệp tin đến kí tự (kiểu char) thứ 7+1 = 8 trong tệp tin abc.txt đểđọc (giả sử
tệp tin abc.txt lưu các kí tự kiểu char).

Lưu ý:

• Vì khoảng cách cách dịch chuyển có kiểu số nguyên (int) cho nên có thể nhận giá trị âm
hoặc dương. Nếu giá trị dương, dịch chuyển về phía sau vị trí làm mốc, nếu giá trị âm,
dịch chuyển về phía trước vị trí làm mốc.

• Nếu vị trí dịch chuyển đến nằm ngoài phạm vi tệp tin (phía sau vị trí cuối cùng của tệp
hoặc phía trước vị trí đầu tiên của tệp) sẽ nảy sinh lỗi, khi đó <Tên biến tệp> = false.

Chương trình 4.7 cài đặt chương trình truy nhập tệp tin trực tiếp đểđọc giá trị kí tự (kiểu char)
trong tệp:

• Tên tệp tin (chứa dữ liệu kiểu char) do người dùng nhập vào từ bàn phím.

• Sau đó, mỗi khi người dùng nhập vào một số nguyên, chương trình sẽ dịch chuyển đến vị
trí mới, cách vị trí cũđúng bằng từng ấy kí tự, tính từ vị trí hiện thời của con trỏ tệp.

• Chương trình sẽ kết thúc khi người dùng nhập vào số 0.

Chương trình 4.7

#include<stdlib.h>

#include<iostream.h>

#include<fstream.h>

#include<conio.h>

const int length = 25; // Độ dài tối đa tên tệp tin

void main(){

clrscr();

char fileName[length], output;

cout << “Ten tep tin: ”;

cin >> setw(length) >> fileName; // Nhập tên tệp tin

/* Mở tệp tin */

ifstream fileIn(fileName, ios::in); // Khai báo và mở tệp tin

if(!fileIn){ // Không mở được tệp

cout << “Khong the mo duoc tep tin ” << fileName << endl;

exit(1);

}

/* Đọc dữ liệu từ tệp tin ra màn hình

* Ghi vi trí con trỏ tệp ra màn hình cứ sau 5 lần đọc kí tự */
int index = 1;

do{

cout << “So ki tu dich chuyen: ”;

cin >> index;

// Dịch chuyển con trỏ tệp từ vị trí hiện thời

fileIn.seekg(sizeof(char)*index, ios::cur);

if(fileIn){ // Đúng

fileIn >> output; // Đọc kí tự từ tệp tin

// Ghi kí tự ra màn hình

cout << “Vi tri: ” << fileIn.tellg() << output;

}else{ // Ra khỏi phạm vi tệp

fileIn.clear(); // Về vị trí đầu tệp

}

}while(index);

/* Đóng tệp tin */

fileIn.close(); // Đóng tệp tin

return;

}

TỔNG KẾT CHƯƠNG 4

Nội dung chương 4 đã tập trung trình bày các vấn đề liên quan đến các thao tác trên tệp tin trong
ngôn ngữ C++. Bao gồm:

• Các bước tuần tự khi thao tác với một tệp tin:

- Mở tập tin

- Đọc/ghi dữ liệu trên tệp tin

- Đóng tệp tin

• Thao tác mở tệp tin với nhiều chếđộ bằng kiểu fstream.

• Thao tác mở tệp tin chỉđểđọc với kiểu ifstream

• Thao tác mở tệp tin chỉđể ghi với thao tác ofstream.

• Đọc dữ liệu từ tệp tin văn bản với thao tác “>>”.

• Ghi dữ liệu vào tệp tin văn bản bằng thao tác “<<”.

• Đọc tệp tin nhị phân bằng thao tác read().

• Ghi vào tệp tin nhị phân bằng thao tác write().

• Xác định vị trí hiện thời của con trỏ tệp tin với các thao tác tellg() và tellp().

• Dịch chuyển vị trí của con trỏ tệp với các thao tác seekg() và seekp().

• Thiết lập lại trạng thái cho con trỏ tệp tin bằng thao tác clear().

• Đóng tệp tin đã sử dụng bằng thao tác close().

CÂU HỎI VÀ BÀI TẬP CHƯƠNG 4

1. Muốn mở một tệp tin tên là abc.txt đểđọc dữ liệu, lệnh mở tệp nào sau đây là đúng:

a. fstream myFile(“abc.txt”, ios::in);

b. fstream myFile(“abc.txt”, ios::out);

c. fstream myFile(“abc.txt”, ios::app);

d. fstream myFile(“abc.txt”, ios::ate);

2. Muốn mở một tệp tin abc.txt nằm trong thư mục xyz để ghi dữ liệu vào. Lệnh mở nào sau
đây là đúng:

a. fstream myFile(“xyz\abc.txt”, ios::out);

b. fstream myFile(“xyz\\abc.txt”, ios::out);

c. fstream myFile(“xyz/abc.txt”, ios::out);

d. fstream myFile(“xyz//abc.txt”, ios::out);

3. Muốn mở một tệp tin abc.txt để ghi thêm dữ liệu vào cuối tệp, lệnh nào sau đây là đúng:

a. fstream myFile(“abc.txt”, ios::out);

b. fstream myFile(“abc.txt”, ios::app);

c. fstream myFile(“abc.txt”, ios::out|ios::app);

d. fstream myFile(“abc.txt”, ios::out||ios::app);

4. Xét hai lệnh khai báo sau:

fstream myFile1(“abc.txt”, ios::out);

ofstream myFile2(“abc.txt”, ios::out);

Nhận định nào sau đây là đúng:

a. myFile1 và myFile2 có chức năng giống nhau.

b. myFile1 và myFile2 có chức năng khác nhau

5. Xét hai lệnh khai báo sau:

fstream myFile1(“abc.txt”, ios::in);

ifstream myFile2(“abc.txt”, ios::in);

Nhận định nào sau đây là đúng:

a. myFile1 và myFile2 có chức năng giống nhau.

b. myFile1 và myFile2 có chức năng khác nhau

6. Xét đoạn chương trình sau:

ofstream myFile(“abc.txt”, ios::out);

if(myFile) myFile << “abc.txt”;

Chương trình sẽ làm gì?

a. Ghi ra màn hình dòng chữ “abc.txt”

b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”

c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”

d. Chương trình sẽ báo lỗi.

7. Xét đoạn chương trình sau:

ifstream myFile(“abc.txt”, ios::in);

char text[20];

if(myFile) myFile >> text;

Chương trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”?

a. Ghi ra màn hình dòng chữ “abc.txt”

b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”

c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”

d. Chương trình sẽ báo lỗi.

8. Xét đoạn chương trình sau:

fstream myFile(“abc.txt”, ios::out);

if(myFile) myFile << “abc.txt”;

myFile.close();

myFile.open(“abc.txt”, ios::in);

char text[20];

if(myFile) myFile >> text;

cout << text;

Chương trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”?

a. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”

b. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”

c. Ghi ra màn hình dòng chữ “abc.txt”

d. Cả ba đáp án trên.

e. Chương trình sẽ báo lỗi.

9. Xét đoạn chương trình sau:

ifstream myFile(“abc.txt”, ios::in);

if(myFile) cout << myFile.tellg();

Chương trình sẽ in ra màn hình kết quả gì?

a. 0

b. 1

c. 8

d. 16

10. Xét đoạn chương trình sau, nếu tệp abc.txt chứa một số lượng kí tựđủ lớn:

ifstream myFile(“abc.txt”, ios::in);

if(myFile){

char c;

myFile >> c;

cout << myFile.tellg();

}

Chương trình sẽ in ra màn hình kết quả gì?

a. 0
b. 1

c. 8

d. 16

11. Xét đoạn chương trình sau, nếu tệp abc.txt chứa một số lượng kí tựđủ lớn:

ifstream myFile(“abc.txt”, ios::in);

if(myFile){

myFile.seekg(sizeof(char)*5, ios::beg);

myFile.seekg(sizeof(char)*5, ios::cur);

cout << myFile.tellg();

}

Chương trình sẽ in ra màn hình kết quả gì?

a. 0

b. 5

c. 10

d. 80

12. Viết một chương trình gộp nội dung của hai tệp tin có sẵn vào một tệp tin thứ ba. Tên các
tệp tin được nhập vào từ bàn phím.

13. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình
4.4: Tìm tất cả các nhân viên có tên là X, X được nhập từ bàn phím. Hiển thị kết quả là tất
cả các thông tin về các nhân viên được tìm thấy.

14. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình
4.4: Tìm tất cả các nhân viên có năm sinh là X, X được nhập từ bàn phím. Hiển thị kết quả
là tất cả các thông tin về các nhân viên được tìm thấy.

15. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình
4.4: Tìm tất cả các nhân viên có lương cao hơn hoặc bằng một giá trị X, X được nhập từ
bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên được tìm thấy.

16. Viết một chương trình sao chép một đoạn đầu nội dung của một tệp tin vào một tệp tin thứ
hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép được nhập từ bàn phím.

17. Viết một chương trình sao chép một đoạn cuối nội dung của một tệp tin vào một tệp tin
thứ hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép được nhập từ bàn phím.

fstream myFile(“abc.txt”, ios::in|ios::out|ios::text);

4.1.2 Tệp văn bản

Để mở một tệp tin dưới chếđộ văn bản, ta dùng cú pháp sau:

fstream <Tên biến tệp>(<Tên tệp>, ios::text);

Khi đó, các thao tác đọc, ghi trên biến tệp được thực hiện theo đơn vị là các từ, được phân cách
bởi dấu trống (space bar) hoặc dấu xuống dòng (enter).

Ví dụ, muốn mở tệp tin baitho.txt dưới chếđộ văn bản, ta khai báo như sau:

fstream myBaiTho(“baitho.txt”, ios::text);

4.1.3 Tệp nhị phân

Để mở một tệp tin dưới chếđộ nhị phân, ta dùng cú pháp sau:

fstream <Tên biến tệp>(<Tên tệp>, ios::binary);

Khi đó, các thao tác đọc, ghi trên biến tệp được thực hiện theo đơn vị byte theo kích thước các
bản ghi (cấu trúc) được ghi trong tệp.

Ví dụ, muốn mở tệp tin baitho.txt dưới chếđộ nhị phân, ta khai báo như sau:

fstream myBaiTho(“baitho.txt”, ios::binary);
luongbv93
luongbv93
Admin

Tổng số bài gửi : 117
Points : 354
Reputation : 0
Join date : 18/11/2011
Age : 30
Đến từ : Hà Nội

https://diendanteenviet.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết