Streams dòng nhập xuất• Hệ thống file của C được thiết kế để làmviệ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ừ, .... Nếuđóng một file đang
Trang 1CHƯƠNG 9
TẬP TIN (FILE)
Trang 32 Streams và Files
• Hệ thống nhập xuất của C
– Cung cấp một giao diện (interface) nhấtquá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ữalậ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.
Trang 43 Streams (dòng nhập xuất)
• Hệ thống file của C được thiết kế để làmviệ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
Trang 53 Streams (dòng nhập xuất)
• 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ộttập tin trên đĩa cũng có thể dùng để ghivào loại thiết bị khác như console (mànhình).
• Có hai loại stream:
– Văn bản (text)
– Nhị phân (binary)
Trang 63.1 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ị đổithành cặp ký tự carriage return/linefeed(ký tự xuống dòng và về đầu dòng)
Trang 73.1 Text Streams
• 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êncác thiết bị ngoài Do đó số ký tự đượcviết (hay đọc) có thể khác số số ký tự trênthiết bị ngoài
Trang 83.2 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ênthiết bị ngoài Nghĩa là không có sựchuyển đổi xảy ra Do đó, số bytes đượcviết (hay đọc) thì bằng với số bytes trênthiết bị ngoài
Trang 114 FILES
• Để ngắt kết nối giữa một stream với mộtfile 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 đượcviết ra thiết bị ngoài
• Qúa trình này được gọi là flushing và đảmbảo là không có thông tin bị để lại trongvùng đệm (buffer)
Trang 124 FILES
• Tất cả file được tự động đóng khi chươngtrình mở chúng kết thúc bình thường Fileskhô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àmabort()
• Mỗi stream liên đới với một file có một cấutrúc kiểu FILE
Trang 13putc( ) 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
Trang 14fgetc( ) 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.
Trang 15ferror( ) Trả về true nếu một lỗi xảy ra.
rewind( ) Đưa indicator về đầu.
Trang 164.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ạngthá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ấttrên file
• Cú pháp khai báo:
FILE *fp;
Trang 174.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 file
• mode: cho biết mở file theo mode nào.
FILE *fopen(const char *filename, const char *mode);
Trang 194.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ề contrỏ trỏ đến ký tự cuối cùng của tập tin Nếutập tin không tồn tại, một tập tin mới đượctạo Trả về NULL nếu không thể mở tậptin
• "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
Trang 204.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ự đầ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ó trongtập tin
Trang 224.4 Đóng file
• Hàm fclose() đóng stream được mở bởihàm fopen() Khi hàm được gọi, nó sẽ viếtbấ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);
Trang 234.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 đươngnhau Hàm putc() ghi một ký tự đến mộtfile đã đượ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);
Trang 24VD: đọc ký tự từ bàn phím và ghi vào file đến khi gặp kt $ void main()
}while (ch != '$');
fclose(fp);//đóng file}
Trang 25• 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
Trang 26void main()
{
FILE *fp; char ch;
if((fp=fopen(”test.txt”, "r"))==NULL) {
cout << "Cannot open file.\n";
Trang 273.8 Đọ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ộtcon trỏ null nếu không
• Cú pháp:
char *fgets(char *str, int length, FILE *fp);
Trang 283.8 Đọc và viết chuổi trên file
• 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);
Trang 304.9 Hàm fread() và fwrite()
• Hàm fread() và fwrite() : đọc và ghi mộtkhối của bất kỳ dữ liệu nào có kích thướclớ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);
Trang 334.12 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
Trang 344.13 Flushing a stream
• Hàm fflush() dùng để xuất tất cả nội dungcò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ạitrả về EOF
Trang 355 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);
Trang 366 Các stream chuẩn
• Khi một chương trình thực thi, ba streamđược mở tự động Đó là stdin (standardinput), stdout (standard output), và stderr(standard error) stdin dùng để đọc từ bànphím, stdout và stderr dùng để viết đếnmàn hình
• Bởi vì standard streams là các con trỏ filenên có thể dùng các hàm nhập xuất trênchúng