x9nd
05-23-2009, 05:30 PM
21. Các stream chuẩn.
- Mỗi khi một chương tŕnh C bắt đầu thực thi dưới DOS, hệ điều hành sẽ tự động mở 5 stream đặc biệt.
+ Nhập chuẩn (stdin)
+ Xuất chuẩn (stdout)
+ Lỗi chuẩn (stderr)
+ Máy in chuẩn (stdprn)
+ Thiêt bị hỗ trợ chuẩn (stdaux)
- Trong đó, stdin, stdout và stderr được gán mặc định cho các thiết bị nhập/ xuất chuẩn của hệ thống trong khi stdprn được gán cho cổng in song song đầu tiên vá stdaux được gán cho cổng nối tiếp đầu. Chúng được định nghĩa như là các con trỏ cố định kiểu FILE, v́ vậy chúng có thể được sử dụng ở bất kỳ nơi nào mà việc sử dụng con trỏ FILE là hợp lệ. Chúng cùng có thể được chuyển một cách hiệu quả cho các stream hay thiết bị khác mỗi khi cần định hướng lại.
22. Con trỏ kích hoạt hiện hành.
- Đê lần theo vị trí nơi mà các thao tác nhập/xuất đang diễn ra, một con trỏ được duy tŕ trong cấu trúc FILE. Mỗi khi một kư tự được đọc ra hay ghi vào stream, con trỏ kích hoạt hiện hành (current active pointer) (gọi là curp) được tăng lên. Hầu hết các hàm xuất đều tham chiếu đến curp, và cập nhập nó sau các thủ tục nhập hoặc xuất trên stream. Vị trí hiện hành của con trỏ này có thể được t́m thấy bằng sự trợ giúp của hàm ftell(). Hàm ftell() trả về một giá trị kiểu long int biểu diễn ví trí của curp tính từ đầu tập tin trong stream đă cho. Nguyễn mẫu của hàm ftell() là:
Code:
long int ftell(FILE *fp);
* Đặt lại vị trí hiện hành
- Ngay sau khi mở stream, con trỏ kích hoạt hiện hành được đặt là 0 và trỏ đến byte đầu tiên của stream. Như đă thấy trước đây, mỗi khi có một kư tự được đọc hay ghi vào stream, con trỏ kích hoạt hiện hành sẽ tăng lên. Bên trong một chương tŕnh, c̣n trỏ có thể được đặt đến một vị trí bất kỳ khác với vị trí hiện hành vào bất kỳ lúc nào. Hàm rewind() đặt vị trí con trỏ này về đầu. Một hàm khác được sử dụng để đặt lại vị trí con trỏ này là fseek().
- Hàm fseek() định lại vị trí của curp dời đi một số byte tính từ đầu, từ vị trí hiện hành hay từ cuối stream là tùy vào vị trí được quy định khi gọi hàm fseek(). Nguyên mẫu của hàm fseek() là:
Code:
int fseek(FILE *fp, long int offset, int origin)
- Trong đó offset là số byte cần di chuyển vượt qua vị trí tập tin được cho bởi tham số origin. Tham số origin chi định vị trí bắt đầu t́m kiếm và phải có giá trị là 0,1 hoặc 2, biểu diễn cho3 hằng kư tự hiệu (được định nghĩa trong stdio.h) như trong bảng 21,4:
<picture>
- Hàm fseek() trả về giá trị 0 nếu đă thành công và giá trị khác 0 nếu thất bại.
23. Hàm fprintf() và fscanf()
- Ngoài các hàm nhập xuất đă được thảo luận, hệ thống nhập/xuất có vùng đệm c̣n bao gồm các hàm fprintf() và scanf(). Các hàm này tương tự như hàm printf() và scanf() ngoại trừ rằng chúng thao tác trên tập tin. Nguyên mẫu của hàm fprintf() và fscanf() là:
Code:
int fprintf(FILE *fp, const char *control_string,..);
int fscanf(FILE *fp, const char *control_string,..);
- Trong đó fp là con trỏ tập tin bởi lời gọi hàm fopen(). Hàm fprintf() và fscanf() định hướng các thao tác nhập xuất của chúng đến tập tin được trỏ bởi fp.
Bài tập tự làm
1. Việt một chương tŕnh để nhập dữ liệu vào một tập tin và in nó theo thứ tự ngược lại.
2. Viết một chương tŕnh để truyền dữ liệu từ một tập tin này sang một tập tin khác, loại bỏ tất cả các nguyên âm (a,e,i,o,u). Loại bỏ các nguyên âm ở dạng chữ hoa lẫn chữ thường. Hiển thị nội dung của tập tin mới.
- Mỗi khi một chương tŕnh C bắt đầu thực thi dưới DOS, hệ điều hành sẽ tự động mở 5 stream đặc biệt.
+ Nhập chuẩn (stdin)
+ Xuất chuẩn (stdout)
+ Lỗi chuẩn (stderr)
+ Máy in chuẩn (stdprn)
+ Thiêt bị hỗ trợ chuẩn (stdaux)
- Trong đó, stdin, stdout và stderr được gán mặc định cho các thiết bị nhập/ xuất chuẩn của hệ thống trong khi stdprn được gán cho cổng in song song đầu tiên vá stdaux được gán cho cổng nối tiếp đầu. Chúng được định nghĩa như là các con trỏ cố định kiểu FILE, v́ vậy chúng có thể được sử dụng ở bất kỳ nơi nào mà việc sử dụng con trỏ FILE là hợp lệ. Chúng cùng có thể được chuyển một cách hiệu quả cho các stream hay thiết bị khác mỗi khi cần định hướng lại.
22. Con trỏ kích hoạt hiện hành.
- Đê lần theo vị trí nơi mà các thao tác nhập/xuất đang diễn ra, một con trỏ được duy tŕ trong cấu trúc FILE. Mỗi khi một kư tự được đọc ra hay ghi vào stream, con trỏ kích hoạt hiện hành (current active pointer) (gọi là curp) được tăng lên. Hầu hết các hàm xuất đều tham chiếu đến curp, và cập nhập nó sau các thủ tục nhập hoặc xuất trên stream. Vị trí hiện hành của con trỏ này có thể được t́m thấy bằng sự trợ giúp của hàm ftell(). Hàm ftell() trả về một giá trị kiểu long int biểu diễn ví trí của curp tính từ đầu tập tin trong stream đă cho. Nguyễn mẫu của hàm ftell() là:
Code:
long int ftell(FILE *fp);
* Đặt lại vị trí hiện hành
- Ngay sau khi mở stream, con trỏ kích hoạt hiện hành được đặt là 0 và trỏ đến byte đầu tiên của stream. Như đă thấy trước đây, mỗi khi có một kư tự được đọc hay ghi vào stream, con trỏ kích hoạt hiện hành sẽ tăng lên. Bên trong một chương tŕnh, c̣n trỏ có thể được đặt đến một vị trí bất kỳ khác với vị trí hiện hành vào bất kỳ lúc nào. Hàm rewind() đặt vị trí con trỏ này về đầu. Một hàm khác được sử dụng để đặt lại vị trí con trỏ này là fseek().
- Hàm fseek() định lại vị trí của curp dời đi một số byte tính từ đầu, từ vị trí hiện hành hay từ cuối stream là tùy vào vị trí được quy định khi gọi hàm fseek(). Nguyên mẫu của hàm fseek() là:
Code:
int fseek(FILE *fp, long int offset, int origin)
- Trong đó offset là số byte cần di chuyển vượt qua vị trí tập tin được cho bởi tham số origin. Tham số origin chi định vị trí bắt đầu t́m kiếm và phải có giá trị là 0,1 hoặc 2, biểu diễn cho3 hằng kư tự hiệu (được định nghĩa trong stdio.h) như trong bảng 21,4:
<picture>
- Hàm fseek() trả về giá trị 0 nếu đă thành công và giá trị khác 0 nếu thất bại.
23. Hàm fprintf() và fscanf()
- Ngoài các hàm nhập xuất đă được thảo luận, hệ thống nhập/xuất có vùng đệm c̣n bao gồm các hàm fprintf() và scanf(). Các hàm này tương tự như hàm printf() và scanf() ngoại trừ rằng chúng thao tác trên tập tin. Nguyên mẫu của hàm fprintf() và fscanf() là:
Code:
int fprintf(FILE *fp, const char *control_string,..);
int fscanf(FILE *fp, const char *control_string,..);
- Trong đó fp là con trỏ tập tin bởi lời gọi hàm fopen(). Hàm fprintf() và fscanf() định hướng các thao tác nhập xuất của chúng đến tập tin được trỏ bởi fp.
Bài tập tự làm
1. Việt một chương tŕnh để nhập dữ liệu vào một tập tin và in nó theo thứ tự ngược lại.
2. Viết một chương tŕnh để truyền dữ liệu từ một tập tin này sang một tập tin khác, loại bỏ tất cả các nguyên âm (a,e,i,o,u). Loại bỏ các nguyên âm ở dạng chữ hoa lẫn chữ thường. Hiển thị nội dung của tập tin mới.