67
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI 1 KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu Email: [email protected] Blog: http://xuandieu.wordpress.

KỸ THUẬT LẬP TRÌNH

Embed Size (px)

DESCRIPTION

KỸ THUẬT LẬP TRÌNH. GV: Phạm Thị Xuân Diệu Email: [email protected] Blog: http://xuandieu.wordpress.com. Chương 5:. Kiểu dữ liệu Chuỗi - File. 1. Khái niệm và cấu trúc về chuỗi. 2. Các hàm nhập xuất chuỗi. 3. Một số hàm cơ bản về chuỗi. 5 . Tạo text file – truy xuất text file. - PowerPoint PPT Presentation

Citation preview

Page 1: KỸ THUẬT LẬP TRÌNH

1

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

KỸ THUẬT LẬP TRÌNH

GV: Phạm Thị Xuân DiệuEmail: [email protected]: http://xuandieu.wordpress.com

Page 2: KỸ THUẬT LẬP TRÌNH

2

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Kiểu dữ liệu Chuỗi - File

Chương 5:

Page 3: KỸ THUẬT LẬP TRÌNH

3

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. Khái niệm và cấu trúc về chuỗi

2. Các hàm nhập xuất chuỗi

3. Một số hàm cơ bản về chuỗi

5. Tạo text file – truy xuất text file

4. Mảng và chuỗi

Page 4: KỸ THUẬT LẬP TRÌNH

4

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. Khái niệm

• Chuỗi là một mảng ký tự được kết thúc bằng ký tự null (‘\0’).

• Ký tự null (‘\0’) là ký tự dùng để kết thúc Chuỗi• Hằng Chuỗi là Chuỗi được bao quanh bởi cặp dấu

nháy đôi. Ví dụ: “Hello”• Ví dụ: để khai báo một mảng str chứa chuỗi có độ dài

20 ký tự, ta khai báo:

char str[21];

Page 5: KỸ THUẬT LẬP TRÌNH

5

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. 1. Khai báo và khởi tạo Chuỗi

Có 2 cách khai báo và khởi tạo Chuỗi– Cách 1: Dùng mảng một chiều

Ví dụ: char str[12];

char <Tên biến> [Chiều dài tối đa] char <Tên biến> [Chiều dài tối đa]

Page 6: KỸ THUẬT LẬP TRÌNH

6

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. 1. Khai báo và khởi tạo Chuỗi

Ví dụ: char str[25]; Ý nghĩa khai báo một mảng kiểu ký tự

tên là str có 25 phần tử ( như vậy tối đa ta có thể nhập 24 ký tự vì phần tử thứ 25 đã chứa ký tự kết thúc chuỗi ‘\0’.

Lưu ý: Chuỗi ký tự được kết thúc bằng ký tự ‘\0’. Do đó khi khai báo độ dài của chuỗi luôn luôn khai báo dư 1 phần tử để chứa ký tự ‘\0’.

Page 7: KỸ THUẬT LẬP TRÌNH

7

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

− Cách 2: Dùng con trỏ

 

•Ví dụ: char *str; Trong khai báo này, bộ nhớ sẽ dành 2

byte để lưu trữ địa chỉ của biến con trỏ str đang chỉ đến, chưa cung cấp nơi để lưu trữ dữ liệu.

char *<Tên biến>char *<Tên biến>

1. 1. Khai báo và khởi tạo Chuỗi

Page 8: KỸ THUẬT LẬP TRÌNH

8

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

− Cách 2: Dùng con trỏ Trước khi sử dụng phải dùng từ khóa

new để cấp phát vùng nhớ.Ví dụ:

char *str;str = new char[51];//Cấp phát 51 ký tự

1. 1. Khai báo và khởi tạo Chuỗi

Page 9: KỸ THUẬT LẬP TRÌNH

9

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. 1. Khai báo và khởi tạo Chuỗi

Chuỗi ký tự giống như mảng do đó để khởi tạo một Chuỗi ký tự với những giá trị xác định ta có thể thực hiện tương tự như với mảng.

char <Biến>[ ]=<”Hằng Chuỗi ”>char <Biến>[ ]=<”Hằng Chuỗi ”>

Page 10: KỸ THUẬT LẬP TRÌNH

10

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

1. 1. Khai báo và khởi tạo Chuỗi

Ví dụ:

char str[] = {‘H’, ’e’, ’l’, ’l’, ’o’, ’\0’};

char str[] = “Hello”;

char *str = “Hello”;

Page 11: KỸ THUẬT LẬP TRÌNH

11

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

2.1. Nhập Chuỗi

Để nhập dữ liệu cho biến Chuỗi, ta dùng hàm gets() của thư viện stdio.h.

Hàm gets() đọc các ký tự từ bàn phím vào trong mảng trỏ đến bởi s cho đến khi nhấn Enter. Ký tự null sẽ được đặt sau ký tự cuối cùng của Chuỗi nhập vào trong mảng.

char *gets(char *s);

Page 12: KỸ THUẬT LẬP TRÌNH

12

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Lưu ý: Khi dùng cin>> để nhập dữ liệu cho chuỗi, chương trình sẽ tự động ngắt chuỗi khi gặp ký tự khoảng trắng trong chuỗi. Do đó, để chuỗi không bị ngắt khi gặp ký tự khoảng trắng, ta sẽ dùng hàm gets(), hoặc cin.getline() thay vì hàm cin thông thường.

2.1. Nhập Chuỗi

*cin.getline(chuỗi, số ký tự tối đa);*Ví dụ:

char *str;str = new char [30];cin.getline(str, 30);

Page 13: KỸ THUẬT LẬP TRÌNH

13

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

2.2. Xuất Chuỗi

Để xuất Chuỗi ra màn hình, ta dùng hàm puts() của thư viện stdio.h.  

Hoặc ta có thể dùng cout

cout << s;

int puts(const char *s);int puts(const char *s);

Page 14: KỸ THUẬT LẬP TRÌNH

14

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Ví dụ:#include <iostream.h>

#include <stdio.h>

int main()

{

char str[20];

cout<<“Nhap chuoi:";

gets(str);

cout<<"\n Xuat chuoi:";

puts(str);

return 0;

}

2.2. Xuất Chuỗi

Page 15: KỸ THUẬT LẬP TRÌNH

15

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

2.2. Xuất Chuỗi

Page 16: KỸ THUẬT LẬP TRÌNH

16

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Để sử dụng các hàm này, ta phải khai báo dòng lệnh sau:

#include <string.h> Sao chep nội dung chuỗi nguồn vào

chuỗi đích, nội dung của chuỗi đích sẽ bị xóa.

strcpy(char *đích, char *nguồn);

Page 17: KỸ THUẬT LẬP TRÌNH

17

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Ví dụ: strcpy(s1, s2): Sao chep Chuỗi s2 vào s1#include <iostream.h>

#include <stdio.h>

#include <string.h>

void main()

{

char str1[20], str2[20];

cout<<"nhap chuoi 1:"; gets(str1);

strcpy(str2,str1);

cout<<"\nXuat chuoi 2:"; puts(str2);

}

Page 18: KỸ THUẬT LẬP TRÌNH

18

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Chep n ký tự từ chuỗi nguồn sang chuỗi đích. Nếu chiêu dài nguồn < n thì hàm sẽ điên khoảng trắng cho đủ n ký tự vào đích.strncpy(char *đích, char *nguồn, int n);

Ví dụ:

Page 19: KỸ THUẬT LẬP TRÌNH

19

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Nối chuỗi s2 vào cuối chuỗi s1

strcat(s1, s2)Ví dụ:

#include <iostream.h>

#include <stdio.h>

#include <string.h>

void main()

{

char str1[20], str2[20];

cout<<"nhap chuoi 1:"; gets(str1);

cout<<"\nhap chuoi 2:"; gets(str2);

strcat(str1,str2);

cout<<"\nXuat chuoi sau khi noi:";

puts(str1);

}

Page 20: KỸ THUẬT LẬP TRÌNH

20

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1

strncat(char s1[],char s2[],int n);

Page 21: KỸ THUẬT LẬP TRÌNH

21

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi• strchr(s1, ch) : Trả vê con trỏ đến vị trí xuất hiện

đầu tiên của ký tự ch trong Chuỗi s1Ví dụ:

void main()

{

char *p, h, str1[20];

cout<<"nhap chuoi 1:”; gets(str1);

cout<<"Nhap ktu muon tim:"; cin>>h;

p= strchr(str1,h);

if(p==NULL) cout<<"Khong tim thay ";

else cout<<"Tim thay tai vi tri "<<(p-str1);

}

Page 22: KỸ THUẬT LẬP TRÌNH

22

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

CONG NGHE DONG NAI0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Page 23: KỸ THUẬT LẬP TRÌNH

23

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

• strstr(s1, s2): Trả vê con trỏ đến vị trí xuất hiện đầu tiên của Chuỗi s2 trong s1.Ví dụ: void main()

{ char *p, str1[20], str2[20];

cout<<"nhap chuoi 1:"; gets(str1);

cout<<"nhap chuoi 2:"; gets(str2);

p= strstr(str1,str2);

if(p==NULL)

cout<<"Khong tim thay ";

else

cout<<"Tim thay tai vi tri "<<(p-str1);

}

Page 24: KỸ THUẬT LẬP TRÌNH

24

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Tính độ dài của chuỗi sstrlen(char *s);

void main(){

char *ch = "Lap trinh C";cout<<"Do dai s = "<<strlen(ch);

}Kết quả

Do dai s = 11

Page 25: KỸ THUẬT LẬP TRÌNH

25

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

* Nối chuỗi s2 vào chuỗi s1strcat(char s1[],char s2[]);

*Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1strncat(char s1[],char s2[],int n);

*So sánh 2 chuỗi s1 và s2 theo nguyên tắc thứ tự từ điển. Phân biệt chữ hoa và thường.Trả vê :

0 : nếu s1 bằng s2.=1: nếu s1 lớn hơn s2.=-1: nếu s1 nhỏ hơn s2.

strcmp(char s1[],char s2[]);

Page 26: KỸ THUẬT LẬP TRÌNH

26

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Page 27: KỸ THUẬT LẬP TRÌNH

27

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

*So sánh n ký tự đầu tiên của s1 và s2, giá trị trả vê tương tự hàm strcmp()

strncmp(char s1[],char s2[], int n);*So sánh chuỗi s1 và s2 nhưng không phân biệt hoa thường, giá trị trả vê tương tự hàm strcmp()

stricmp(char s1[],char s2[]);*So sánh n ký tự đầu tiên của s1 và s2 nhưng không phân biệt hoa thường, giá trị trả vê tương tự hàm strcmp()

strnicmp(char s1[],char s2[], int n);

Page 28: KỸ THUẬT LẬP TRÌNH

28

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Chuyển ký tự thường sang ký tự hoa

toupper( int ch );

Chuyển ký tự hoa sang ký tự thường

tolower( int ch );

Khai báo thư viện: <ctype.h>

3. Các hàm thao tác trên Chuỗi

Page 29: KỸ THUẬT LẬP TRÌNH

29

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

3. Các hàm thao tác trên Chuỗi

Page 30: KỸ THUẬT LẬP TRÌNH

30

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

4.1. Mảng các chuỗi

Mảng các Chuỗi là một mảng ký tự hai chiêu. Kích thước của chỉ mục thứ nhất là số Chuỗi và kích thước của chỉ mục thứ hai xác định chiêu dài lớn nhất của mỗi Chuỗi.

Ví dụ: char str[5][80]; Khai báo một mảng của 5 Chuỗi, mỗi Chuỗi có chiêu dài tối đa là 79 ký tự.

Page 31: KỸ THUẬT LẬP TRÌNH

31

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

4.1. Mảng các chuỗi

Khai báo và khởi tạo mảng các Chuỗi

char arrayList[][length] = { constantString1,

constantString2,

...

constantStringN};Ví dụ:

char listOfPL[][10] = {“Pascal”, “C++”, “C#”};

Page 32: KỸ THUẬT LẬP TRÌNH

32

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Ví dụ:void main()

{

char list[5][20];

for(int i=0; i<5; i++)

{

cout<<"name"<<i<<":“; cin>>list[i];

}

for(int j=0; j<5; j++)

cout<<" "<<list[j];

}

4.1. Mảng các chuỗi

Page 33: KỸ THUẬT LẬP TRÌNH

33

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

4.2. Mảng con trỏ đến các Chuỗi

Ngoài cách dùng mảng ký tự hai chiêu để lưu trữ mảng các Chuỗi, ta có thể dùng mảng của các con trỏ. Mỗi con trỏ sẽ chứa địa chỉ của Chuỗi

Ví dụ:

char *str[20];

Page 34: KỸ THUẬT LẬP TRÌNH

34

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

4.2. Mảng con trỏ đến các Chuỗi

Cũng ví dụ như phần trên, ta dùng mảng con trỏ char *listOfPL[] = {“Pascal”, “C/C++”, “CSharp”, “Java”, “VB”};

Mảng con trỏ trên có thể được lưu trữ trong bộ nhớ như sau:

Page 35: KỸ THUẬT LẬP TRÌNH

35

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

void main(){

char *name[5];for(int i=0 ; i<5 ; i++)

//name[i] = (char *)malloc(20);name[i] = new char[20];

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

cout << "Input name " << i+1 <<": ";gets(name[i]);

}  cout << "List of names: ";

for(int i=0 ; i<5 ; i++)cout << name[i] << ", ";

}

4.2. Mảng con trỏ đến các Chuỗi

Page 36: KỸ THUẬT LẬP TRÌNH

36

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5. TẬP TIN (FILE)

C/C++ hỗ trợ 2 hệ thống nhập xuất: Một hệ thống thừa kế từ ngôn ngữ C Một hệ thống nhập xuất hướng đối

tượng của C++.

Page 37: KỸ THUẬT LẬP TRÌNH

37

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.1. Streams và Files

Hệ thống nhập xuất của C Cung cấp một giao diện (interface) nhất

quán độc lập với thiết bị thật sự mà chương trình tương tác.

cung cấp một mức độ trừu tượng giữa lập trình viên và thiết bị nhập xuất. Sự trừu tượng này được gọi là stream và thiết bị thật sự được gọi là file.

Page 38: KỸ THUẬT LẬP TRÌNH

38

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.1.1. Streams (dòng nhập xuất)

Hệ thống file của C được thiết kế để làm việc với nhiêu loại thiết bị khác nhau như terminals (thiết bị đầu cuối), các loại ổ đĩa, băng từ, ...

Hệ thống file chuyển đổi mỗi loại thành một thiết bị logic gọi là stream. Tất cả stream có cùng hành vi

Page 39: KỸ THUẬT LẬP TRÌNH

39

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Stream độc lập với thiết bị nên cùng một hoạt động trên stream như ghi vào một tập tin trên đĩa cũng có thể dùng để ghi vào loại thiết bị khác như console (màn hình).

Có hai loại stream: Văn bản (text) Nhị phân (binary).

5.1. Streams và Files

Page 40: KỸ THUẬT LẬP TRÌNH

40

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.1.2. Text Streams

Một text stream là một chuỗi các ký tự. Trong một text stream, một số ký tự có thể bị chuyển đổi tùy thuộc môi trường.

Ví dụ, ký tự newline ('\n') có thể bị đổi thành cặp ký tự carriage return/linefeed (ký tự xuống dòng và về đầu dòng).

Page 41: KỸ THUẬT LẬP TRÌNH

41

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.1.3. Binary Streams

Một binary stream là một chuỗi bytes tương ứng một-một với chuỗi bytes trên thiết bị ngoài. Nghĩa là không có sự chuyển đổi xảy ra. Do đó, số bytes được viết (hay đọc) thì bằng với số bytes trên thiết bị ngoài.

Page 42: KỸ THUẬT LẬP TRÌNH

42

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.2. FILES

Một file có thể là một tập tin trên đĩa, một terminal, hay máy in.

Để tạo kết nối (associate) giữa một stream với một file ta dùng hoạt động mở (open).

Khi file được mở, thông tin có thể được trao đổi giữa file và chương trình.

Page 43: KỸ THUẬT LẬP TRÌNH

43

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Không phải tất cả file đêu có cùng khả năng như nhau.

Ví dụ, một tập tin trên đĩa (file) có thể hỗ trợ truy xuất ngẫu nhiên trong khi đó máy in (cũng là file) thì không thể.

“Tất cả stream là như nhau nhưng file thì không".

5.2. FILES

Page 44: KỸ THUẬT LẬP TRÌNH

44

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Để ngắt kết nối giữa một stream với một file ta dùng hoạt động đóng (close). Nếu đóng một file đang mở cho xuất (output) thì nội dung của stream tương ứng được viết ra thiết bị ngoài.

Quá trình này được gọi là flushing và đảm bảo là không có thông tin bị để lại trong vùng đệm (buffer).

5.2. FILES

Page 45: KỸ THUẬT LẬP TRÌNH

45

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Tất cả file được tự động đóng khi chương trình mở chúng kết thúc bình thường. Files không được đóng khi chương trình mở chúng bị kết thúc bất thường như bị treo (halt) hay khi chương trình thực hiện hàm abort().

Mỗi stream liên đới với một file có một cấu trúc kiểu FILE.

5.2. FILES

Page 46: KỸ THUẬT LẬP TRÌNH

46

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.2.1. Cơ bản về hệ thống file

Tên hàm Chức năng

Tên hàm Chức năng

fopen( ) Mở một file

fclose( ) Đóng một file.

putc( ) Viết một ký tự đến một file.

fputc( ) Giống như putc() .

Các hàm liên quan đến file trong thư viện stdio.h

Page 47: KỸ THUẬT LẬP TRÌNH

47

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Tên hàm Chức năng

ftell( ) Trả vê vị trí hiện hành của của file indicator.

feof( ) Trả vê true nếu duyệt đến cuối file (end-of-file).

ferror( ) Trả vê true nếu một lỗi xảy ra.

rewind( ) Đưa indicator vê đầu.

remove( ) Xóa một file.

fflush( ) Xả hết vùng đệm của file.

5.2.1. Cơ bản về hệ thống file

Page 48: KỸ THUẬT LẬP TRÌNH

48

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.2.2. Con trỏ file (File pointer)

Con trỏ file là một cấu trúc kiểu FILE, trỏ đến thông tin vê file như tên file, trạng thái, và vị trí hiện hành của file.

Con trỏ file được dùng bởi stream tương ứng để thực hiện các hoạt động nhập xuất trên file.

Cú pháp khai báo:FILE *fp;

Page 49: KỸ THUẬT LẬP TRÌNH

49

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.3. Mở file

Hàm fopen() mở một stream và liên kết một file với stream đó. Hàm trả vê một con trỏ file trỏ đến tập tin được mở.

Cú pháp:

filename: chứa tên /đường dẫn của filemode: cho biết mở file theo mode nào.

FILE *fopen(const char *filename, const char *mode);

Page 50: KỸ THUẬT LẬP TRÌNH

50

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Các mode để mở tập tin "r" Nếu tập tin được mở thành công,

hàm fopen() nạp nó vào bộ nhớ và trả vê con trỏ trỏ đến ký tự đầu tiên của tập tin. Ngược lại, hàm fopen() trả vê NULL

"w" Nếu tập tin tồn tại, nội dung của nó sẽ bị ghi đè

5.3. Mở file

Page 51: KỸ THUẬT LẬP TRÌNH

51

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

• "a" Nếu tập tin được mở thành công hàm fopen() nạp nó vào bộ nhớ và trả vê con trỏ trỏ đến ký tự cuối cùng của tập tin. Nếu tập tin không tồn tại, một tập tin mới được tạo. Trả vê NULL nếu không thể mở tập tin.

• "r+" Nếu tập tin được mở thành công, hàm fopen() nạp nó vào trong bộ nhớ. Trả vê NULL nếu không thể mở tập tin.

5.3. Mở file

Page 52: KỸ THUẬT LẬP TRÌNH

52

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

"a+" Nếu tập tin được mở thành công, hàm fopen() nạp nó vào bộ nhớ và trả vê con trỏ trỏ đến ký tự đầu tiên của tập tin. Nếu tập tin không tồn tại, một tập tin mới được tạo. Trả vê NULL nếu không thể mở tập tin.

Các hoạt động có thể làm trên tập tin: đọc, ghi thêm nội dung mới vào cuối tập tin. Không thể sửa đổi nội dung đang có trong tập tin.

5.3. Mở file

Page 53: KỸ THUẬT LẬP TRÌNH

53

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

Ví dụ:FILE *fp;if((fp = fopen("test.txt","w")) == NULL){

cout << "Cannot open file";exit(0);

}

5.3. Mở file

Page 54: KỸ THUẬT LẬP TRÌNH

54

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.4. Đóng file

Hàm fclose() đóng stream được mở bởi hàm fopen(). Khi hàm được gọi, nó sẽ viết bất kỳ dữ liệu nào vẫn còn trong buffer đến file rồi đóng file.

Cú pháp:

fp: là con trỏ file trả vê bởi hàm fopen().

int fclose(FILE *fp);

Page 55: KỸ THUẬT LẬP TRÌNH

55

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.5. Ghi một ký tự đến một file

Có hai hàm xuất ký tự đến file là putc() và fputc(). Hai hàm này là tương đương nhau. Hàm putc() ghi một ký tự đến một file đã được mở bởi hàm fopen().

Cú pháp:

fp là con trỏ file trả vê bởi hàm fopen() ch là ký tự được viết đến file.

int putc(int ch, FILE *fp);

Page 56: KỸ THUẬT LẬP TRÌNH

56

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.6. Đọc một ký tự từ một file

Hàm để đọc một ký tự từ file:getc() và fgetc() Đọc mỗi lần một ký tự từ file được mở

bởi hàm fopen() ở chế độ đọc (read). Cú pháp: int getc(FILE *fp); fp là con trỏ file kiểu FILE .

Hàm trả vê mã ascii của ký tự được đọc, trả vê EOF nếu một lỗi xảy ra.

Page 57: KỸ THUẬT LẬP TRÌNH

57

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.7. Đọc và viết chuỗi trên file

fgets(): đọc một chuỗi từ stream tương ứng cho đến khi gặp ký tự newline hay đã đọc được length-1 ký tự.

Hàm trả vê str nếu đọc thành công và một con trỏ null nếu không.

Cú pháp:

char *fgets(char *str, int length, FILE *fp);

Page 58: KỸ THUẬT LẬP TRÌNH

58

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

fputs() ghi một chuỗi trỏ đến bởi str đến stream trỏ đến bởi con trỏ file fp. Hàm trả vê EOF nếu một lỗi xảy ra.

Cú pháp:

int fputs(const char *str, FILE *fp);

5.7. Đọc và viết chuỗi trên file

Page 59: KỸ THUẬT LẬP TRÌNH

59

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.8. Hàm fread() và fwrite()

Hàm fread() và fwrite() : đọc và ghi một khối của bất kỳ dữ liệu nào có kích thước lớn hơn 1 byte

Cú pháp:

size_t fread(void *buffer, size_t numbytes, size_t count, FILE *fp);size_t fwrite(const void *buffer, size_t numbytes, size_t count,FILE *fp);

Page 60: KỸ THUẬT LẬP TRÌNH

60

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.9. Hàm rewind()

Hàm rewind() di chuyển indicator đến điểm bắt đầu của file.

Hàm có prototype như sau: void rewind(FILE *fp);

Page 61: KỸ THUẬT LẬP TRÌNH

61

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.10. Hàm ferror()

Hàm ferror() cho biết một hoạt động trên file đã gây ra lỗi.

Cú pháp:int ferror(FILE *fp);

Hàm trả vê true nếu một lỗi đã xảy ra với hoạt động trên file trước khi gọi hàm ferror(), ngược lại trả vê false.

Page 62: KỸ THUẬT LẬP TRÌNH

62

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.11. Xóa file

Hàm remove() dùng để xóa tập tin. Cú pháp:

int remove(const char *filename);Hàm trả vê zero nếu xóa thành công,

ngược lại trả vê nonzero

Page 63: KỸ THUẬT LẬP TRÌNH

63

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.12. Flushing a stream

Hàm fflush() dùng để xuất tất cả nội dung còn lại trong buffer của stream.

Cú pháp: int fflush(FILE *fp);

Hàm ghi nội dung còn trong buffer đến file fp. Nếu gọi hàm fflush() không có đối số thì tất cả file đang mở.

Hàm trả vê 0 nếu thành công, ngược lại trả vê EOF

Page 64: KỸ THUẬT LẬP TRÌNH

64

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

5.13. Truy xuất file ngẫu nhiên

Để đọc hay viết từ hay đến một vị trí bất kỳ trong file ta cần sự giúp đỡ của hàm fseek(). Hàm này dùng để di chuyển chỉ báo file.

Cú pháp:

int fseek(FILE *fp, long numbytes, int origin);

Page 65: KỸ THUẬT LẬP TRÌNH

65

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

void luufile(){

FILE *f=fopen("test.txt","w");if(f!=NULL){

cout<<"Tao file thanh cong";char *s="Dai hoc cong nghe dong nai";fputs(s,f);fputs("\n",f);s="khoa cong nghe thong tin";fputs(s,f);

}else{

cout<<"ko duoc";}fclose(f);

}

Page 66: KỸ THUẬT LẬP TRÌNH

66

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

void docfile(){

FILE *f=fopen(“test.txt","r");if(f!=NULL){

char *s=new char[100];s=fgets( s,100,f);while(s!=NULL){

cout<<s;s=fgets( s,100,f);

}cout<<"\n";

} fclose(f);

}

Page 67: KỸ THUẬT LẬP TRÌNH

67

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI

void luufile2(){

FILE *f=fopen(“test.txt","a");if(f!=NULL)

{ while(true) {

char *s=new char[100];cout<<"Nhap chuoi can luu: ";gets(s);fputs(s,f);char hoi[1];cout<<"Tiep ko?(c/k):";gets(hoi);

if(strcmp(hoi,"k")==0) break;fputs("\n",f);

}}else{

cout<<"ko duoc";}fclose(f);

}