1. GIỚI THIỆU
y 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++.
36 trang |
Chia sẻ: phuongt97 | Lượt xem: 402 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Phương pháp lập trình - Chương 9: Tập tin (File) - Võ Quang Hoàng Khang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 9
TẬP TIN (FILE)
1. GIỚI THIỆU
y 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++.
2. Streams và Files
y 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.
3. Streams (dòng nhập xuất)
y 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ừ, ...
y 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
3. Streams (dòng nhập xuất)
y 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).
y Có hai loại stream:
−Văn bản (text)
h hâ (b )−N ị p n inary .
3.1. Text Streams
yMộ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.
y 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).
3.1. Text Streams
y Không có quan hệ một-một giữa các ký tự
được viết (hay đọc) và những ký tự trên các
thiết bị ngoài. Do đó số ký tự được viết (hay
đọc) có thể khác số số ký tự trên thiết bị
ngoài.
3.2. Binary Streams
yMộ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.
4. FILES
yMột file có thể là một tập tin trên đĩa, một
terminal, hay máy in.
yĐể 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 traoy ,
đổi giữa file và chương trình.
4. FILES
y Không phải tất cả file đều có cùng khả năng
như nhau.
y 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ể.
y “Tất cả stream là như nhau nhưng file
thì không".
4. FILES
yĐể 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.
yQúa 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).
4. FILES
y 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().
yMỗi stream liên đới với một file có một cấu
trúc kiểu FILE.
4.1. Cơ bản về hệ thống file
Các hàm liên quan đến file trong thư viện stdio h
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() .
4.1. Cơ bản về hệ thống file
Tên Chức năng
hàm
getc( ) Đọc một ký tự từ một file.
fgetc( ) Giống như getc() .
fgets( ) Đọc một chuổi từ một file.
fputs( ) Viết một chuổi đến một file.
fseek( ) Tìm một byte trong một file.
4.1. Cơ bản về hệ thống file
Tên Chức năng
hàm
ftell( ) Trả về vị trí hiện hành của của file
i di tn ca or.
feof( ) Trả về true nếu duyệt đến cuối file (end-of-file).
f ( ) T ả ề ế ộ lỗi ảerror r v true n u m t x y ra.
rewind( ) Đưa indicator về đầu.
remove( ) Xóa một file.
fflush( ) Xả hết vùng đệm của file.
4.2. Con trỏ file (File pointer)
y 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.
y 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:y
FILE *fp;
4.3. Mở file
yHà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ở.
y Cú pháp:
FILE *fopen(const char *filename, const char *mode);
y filename: chứa tên /đường dẫn của file
ymode: cho biết mở file theo mode nào.
4.3. Mở file
y 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 đè
4.3. Mở file
• "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.
4.3. Mở file
y "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.
y 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.
4.3. Mở file
y Ví dụ:
FILE *fp;
if((fp fopen("test txt" "w")) NULL)= . , ==
{
cout << "Cannot open file";
exit(1);
}
4.4. Đóng file
y 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.
y Cú pháp:
f là ỏ fil ả ề bởi hà f ()
int fclose(FILE *fp);
− p: con tr e tr v m open .
4.5. Ghi một ký tự đến một file
y 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().
y Cú pháp:
f là ỏ fil ả ề bởi hà f ()
int putc(int ch, FILE *fp);
− p con tr e tr v m open
− ch là ký tự được viết đến file.
VD: đọc ký tự từ bàn phím và ghi vào file đến khi gặp kt $
void main()
{
FILE *fp; char ch;
if((fp=fopen(“test.txt”, "w"))==NULL)
{ cout << "Cannot open file.\n";
exit(1);
}
do {
ch = getchar();//đọc từ bàn phím
putc(ch, fp);//ghi vào file
}while (ch != '$');
fclose(fp);//đóng file
}
4.6. Đọc một ký tự từ một file
y Hàm để đọc một ký tự từ file:getc() và
fgetc()
Đ ỗi lầ ột ký tự từ fil đượ ở bởi− ọc m n m e c m
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.
void main()
{
FILE *f h hp; c ar c ;
if((fp=fopen(”test.txt”, "r"))==NULL)
{
cout << "Cannot open file.\n";
exit(1);
}
ch = getc(fp); // đọc một ký tự
while (ch!=EOF)
{
putchar(ch); // in ra màn hình
ch = getc(fp);
}fclose(fp);
}
3.8. Đọc và viết chuổi trên file
y 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ự.
y Hàm trả về str nếu đọc thành công và một
con trỏ null nếu không.
y Cú pháp:
char *fgets(char *str, int length, FILE *fp);
3.8. Đọc và viết chuổi trên file
y 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.
y Cú pháp:
int fputs(const char *str, FILE *fp);
void main(void)
{
h t [80] FILE *fc ar s r ; p;
if((fp = fopen("teststr.txt", "w"))==NULL)
{
cout << "Cannot open file.\n";
exit(1);
}
Do {
cout << "Enter a string (CR to quit):\n";
gets(str);
strcat(str "\n"); /* add a newline */,
fputs(str, fp);
} while(*str!='\n');
}
4.9. Hàm fread() và fwrite()
y 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
y 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);_ , _ , _ ,
4.10. Hàm rewind()
y Hàm rewind() di chuyển indicator đến điểm
bắt đầu của file.
y Hàm có prototype như sau:
void rewind(FILE *fp);
4.11. Hàm ferror()
y Hàm ferror() cho biết một hoạt động trên
file đã gây ra lỗi.
y Cú pháp:
int ferror(FILE *fp);
à ả ề ế ộ lỗ đã ả ớy H m tr v true n u m t i x y ra v i
hoạt động trên file trước khi gọi hàm
f () l ả ề f lerror , ngược ại tr v a se.
4.12. Xóa file
y Hàm remove() dùng để xóa tập tin.
y Cú pháp:
int remove(const char *filename);
y Hàm trả về zero nếu xóa thành công, ngược
l ả ềại tr v nonzero
4.13. Flushing a stream
y Hàm fflush() dùng để xuất tất cả nội dung
còn lại trong buffer của stream.
y Cú pháp: int fflush(FILE *fp);
y 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ở.
à ả ề 0 ế hà h ô l ảy H m tr v n u t n c ng, ngược ại tr
về EOF
5. Truy xuất file ngẫu nhiên
yĐể đọ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.
y Cú pháp:
int fseek(FILE *fp long numbytes int origin);, ,
6. Các stream chuẩn
y Khi một chương trình thực thi, ba stream được
mở tự động. Đó là stdin (standard input), stdout
(standard output), và stderr (standard error). stdin
dùng để đọc từ bàn phím, stdout và stderr dùng
để viết đến màn hình.
y Bởi vì standard streams là các con trỏ file nên có
thể dùng các hàm nhập xuất trên chúng.
Các file đính kèm theo tài liệu này:
- bai_giang_phuong_phap_lap_trinh_chuong_9_tap_tin_file_vo_qua.pdf