PDA

View Full Version : Lư thuyết " Giáo tŕnh ngôn ngữ C Aptech"(Bài 20 : Quản lư tập tin)(tiep theo)


x9nd
05-23-2009, 05:23 PM
Bài 20 : Quản lư tập tin(tiep theo)11. Nhập xuất chuỗi

11. Nhập xuất chuỗi

- Ngoài fgetc() và fputc(), C c̣n hỗ trợ các hàm fputs() và fgets() để ghi vào và đọc ra các chuỗi kư tự từ tập tin trên đĩa. Nguyên mẫu hàm này như sau:

Code:

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

- Hamf fgets() làm việc giống như hàm fputc(), ngoại trừ là nó viết toàn bộ chuỗi vào stream. Nó trả về EOF nếu xảy ra lỗi. Hàm fgets() đọc một chuỗi từ stream đă cho cho đến khi đọc được một kư tự sang ḍng mới hoặc sau khi đă đọc length-1 kư tự. Nếu đọc được một kư tự sang ḍng mới, kư tự này được xem như là một phần của chuỗi (không giống như hàm gets()). Chuỗi kết quả sẽ kết thúc bằng kư tự null. Hàm trả về một con trỏ đến chuỗi nếu thành công và null nếu xảy ra lỗi.

12. Mở một tập tin nhị phân

- Các hàm dùng để xử lư các tập tin nhị phân cũng giống như các hàm sử dụng để quản lư tập tin văn bản. Tuy nhiên, chế độ mở tập tin của hàm fopen() th́ khác đi trong trường hợp các tập tin nhị phân.
- Bảng sau đây liệt kê các chế độ khác nhau của hàm fopen() trong trường hợp mở tập tin nhị phân.

<picture>

- Nếu một tập tin xyz được mở để ghi, câu lệnh sẽ là:

Code:

FILE *fp;
fp = fopen("xyz", "wb");

13. Đóng một tập tin nhị phân

- Ngoài tập tin văn bản, hàm fclose() cũng có thể được dùng để đóng một tập tin nhị phân. Nguyên mẫu hàm của fclose như sau:

Code:

int fclose(FILE *fp);

- Trong đó fp là một con trỏ tập tin đến một tập tin đang mở.
14. Ghi một tập tin nhị phân:

- Một số ứng dụng liên quan đến việc sử dụng các tập tin dữ liệu để lưu trữ các khối dữ liệu, trong đó mỗi khối bao gồm các byte liên tục. Mỗi khối nói chuing sẽ biểu diễn một cấu trúc dữ liệu phức tạp hoặc một mảng.
- Chẳng hạn như, một tập tin dữ liệu có thể bao gồm nhiều cấu trúc có cùng thành phần cấu tạo, hoặc nó có thể chứa nhiều mảng có cùng kiểu và kích thước. Và với những ứng dụng như vậy thường đ̣i hỏi đọc toàn bộ khối dữ liệu từ tập tin dữ liệu hoặc ghi toàn bộ khối vào tập tin dữ liệu hơn là đọc hay ghi các thành phần độc lập (nghĩa là các thành viên của cấu trúc hay các phần tử của mảng) trong mỗi khối riếng biệt.
- Hàm fwrite() được dùng để ghi dữ liệu vào tập tin dữ liệu trong những t́nh huống như vậy. Hàm này có thể dùng để ghi bất kỳ kư kiểu dữ liệu nào. Nguyên mẫu của fwrite() là:

Code:

size_t_fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);

- Kiểu dữ liệu size_t được thêm vào C chuẩn để tăng tính tương tính của chương tŕnh với nhiều hệ thống. Nó được định nghĩa trước như là một kiểu số nguyên đủ lớn để lưu trữ kết quả của hàm sizeof(). Đối với hầu hết các hệ thông, nó có thể được dùng như một số nguyên dương.
- Buffer là một con trỏ trỏ đến thông tin sẽ được ghi vào tập tin. Số byte phải đọc hoặc ghi được cho hỏi num_bytes. Đối số count xác định có bao nhiêu mục (mỗi mục dài num_bytes) được đọc hoặc ghi. Cuối cùng, fp là một con trỏ tập tin trỏ đến một stream đă được mở trước đó. Các tập tin mở cho những thao tác này phải mở ở chế độ nhị phân.
- Hàm này trả vê số lượng các đối tượng đă ghi vào tập tin nếu thao tác ghi thành công. Nếu giá trị này nhỏ hơn count th́ đă xảy ra lỗi. Hàm ferror() (sẽ được thảo luận trong phần tới) có thể được dùng để xác định lỗi.
15. Đọc một tập tin nhị phân.

- Hàm fread() có thể đươc dùng để đọc bất kỳ kiểu dữ liệu nào. Nguyên mẫu hàm là:

Code:

size_t fread(void *buffer, size_t num_bytes, size_t count FILE *fp)

- Buffer là một con trỏ đến vùng nhớ sẽ nhận dữ liệu từ tập tin. Số byte phải đọc hoặc ghi được cho bởi num_bytes. Đối số count xác định có bao nhiêu mục (mỗi mục dài num_bytes) được đọc hoặc ghi. Cuối cùng, fp là một con trỏ tập tin trỏ đến một stream đă được mở trước đó. Các tập tin đă mở cho những thao tác này phải mở ở chế độ nhị phân.
- Hàm này trả về số lượng các đối tượng đă đọc nếu thao tác đọc thành công. Nó trả về 0 nếu đọc đến cuối tập tin hoặc xảy ra lỗi. Hàm feof() và hàm ferror() (sẽ được thảo luận trong phần tới) có thể được dùng để xác định nguyên nhân. Các hàm fread() và fwrite() thường được gọi là các hàm đọc hoặc ghi không định dạng. Miễn là tập tin được mở cho các thao tác nhị phân, hàm fread() và fwrite() có thể độc và ghi bất kỳ kiểu thông tin nào. Ví dụ, chương tŕnh sau đây ghi vào và sau đó đọc ngước ra một số kiểu double, một số kiểu itn và một số kiểu long từ tập tin trên đĩa. Lưu ư rằng nó sử dụng hàm sizeof() để xác định độ dài của một kiểu dữ liệu.

16. Hàm feof()

- Khi một tập tin được mở để đọc ở dạng nhị phân, một số nguyên có giá trị tương đương với EOF có thể được đọc. Trong trường hợp này, quá tŕnh đọc sẽ cho rằng đă đến cuối tập tin, mặc dù chưa đến cuối tập tin thực sự. Một hàm feof() có thể được dùng những trong trường hợp này. Nguyên mẫu của hàm là:

Code:

int feof(FILE *fp);

- Nó trả về true nếu đă đến cuối tập tin, nếu không nó trả về false (0). Hàm này được dùng trong khi đọc dữ liệu nhị phân. Đoạn lệnh sau đây đọc tập nhị phân cho đến cuối tập tin.

Code:

.
.
while (!feof())
ch = fgetc(fp);
.
.


17. Hàm rewind()

- Hàm rewind() đặt lại con trỏ định vị trí bên trong tập tin về đầu tập tin. Nó lấy con trỏ tập tin làm đối số. Cú pháp của rewind() là:

Code:

rewind(fp);

- Chương tŕnh sau mở một tập tin ở chế độ đọc/ghi, sử dụng hàm fputs(). với đầu vào là các chuỗi, đưa con trỏ quay về đầu tập tin và sau đó hiển thị các chuỗi giống như vậy bằng hàm fgets().

18. Hàm ferror()

- Hàm ferror() xác định liệu một thao tác trên tập tin có sinh lỗi không. Nguyên mẫu của hàm là:

Code:

int ferror(FILE *fp)

- Trong đó fp là một con trỏ tập tin hợp lệ. Nó trả về true nếu có xảy ra một lỗi trong thao tác cuối cùng trên tập tin, ngược lại, nó trả về false. V́ mỗi thao tác thiết lập lại t́nh trạng lỗi, nên hàm ferror() phải được gọi ngay sau mỗi thao tác, nếu không lỗi sẽ bị mất.

19. Xóa tập tin

- Hàm remove() xóa một tập tin đă định. Nguyên mẫu của hàm là:

Code:

int remove (char *filename);

- Nó trả về 0 nếu thành công ngược lại trả về một giá trị khác 0.

20. Làm sạch các stream.

- Thông thường, các tập tin xuất chuẩn được trang bị vùng đệm. Điều này có nghĩa là kết xuất cho tập tin được thu nhập trong bộ nhớ và không thật sự hiển thị cho đến khi vùng đệm đầy. Nếu chương tŕnh bị treo hay kết thúc bất thường, một số kư tự vẫn c̣n nằm trong vùng đệm. Kết quả là chương tŕnh có vẻ kêt thúc sớm hơn là nó thật sự đă làm. Hàm fflush() sẽ giải quyết vấn đề này. Như tên gọi của nó, nó sẽ làm sạch vùng đệm và chép những ǵ có trong vùng đệm ra ngoài. Hành động làm sạch tùy theo kiểu tập tin. Một tập tin được mở để đọc sẽ có vùng đệm nhập trống, trong khi một tập tin được mở để ghi thi vùng đệm xuất của nó sẽ được ghi vào tập tin. Nguyên mẫu của hàm này là:

Code:

int fflush(FILE *fp);

- Hàm fflush() sẽ ghi nội dung của bất kỳ vùng đệm dữ liệu nào vào tập tin kết hợp với fp. Hàm fflush(), không có đối số, sẽ làm sạch tất cả các tập tin đang mở để xuất. Nó trả vê giá trị 0 nếu thành công, ngược lại, nó trả về EOF.