intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Ngôn ngữ lập trình C - Chương 5

Chia sẻ: Nguyen Nhi | Ngày: | Loại File: PDF | Số trang:0

143
lượt xem
16
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu tham khảo bài giảng về Ngôn ngữ lập trình C++ gồm 7 chương - Chương 5 Thao tác với tập tin và giao tiếp với hệ thống

Chủ đề:
Lưu

Nội dung Text: Ngôn ngữ lập trình C - Chương 5

  1. Ch−¬ng 5 Ch Thao t¸c víi tËp tin vμ giao tiÕp víi hÖ thèng
  2. 5.1 Luång d÷ liÖu vµ tËp tin 5.1.1 Luồng dữ liệu và thao tác vào/ra – Luồng dữ liệu : • Phương tiện trao đổi thông tin độc lập với các thiết bị truy xuất (còn gọi là kênh nhập/xuất). • Hệ thống tạo ra một thiết bị logic tương ứng với thiết bị vào/ra, gọi là luồng dữ liệu hay kênh nhập/xuất (thường đồng nhất với tệp). • Sử dụng các hàm trong thư viện stdio.h – Các luồng dữ liệu chuẩn: quy định cho các thiết bị chuẩn • Bao gồm các luồng vào (stdin), ra (stdout), báo lỗi (stderr), phụ trợ (stdaux), in (stdprn). • Thông thường là bàn phím, màn hình, cổng COM1, máy in trên PRN hay LPT1. Tuy vậy HĐH có thể hướng đến thiết bị khác. 2 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  3. 5.1 Luång d÷ liÖu vµ tËp tin 5.1.2 Tập tin – Vấn đề lưu trữ dữ liệu • Tốc độ (bộ nhớ trong, bộ nhớ ngoài), cách thức truy nhập… • Thời gian lưu trữ: – Lưu trữ tạm thời: trong thời gian chạy chương trình. – Lưu trữ lâu dài: sử dụng nhiều lần, trao đổi dữ liệu, … – Tập tin • Tập hợp dữ liệu có liên quan với nhau và có cùng kiểu, được lưu trữ trên bộ nhớ ngoài. – Để cho gọn, từ giờ trở đi ta dùng thuật ngữ tệp. • Tệp chứa dữ liệu hiểu theo nghĩa rộng : chương trình, số liệu, các kiểu dữ liệu như kí tự, văn bản, … 3 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  4. 5.1 Luång d÷ liÖu vµ tËp tin 5.1.2 Tập tin – Hệ thống tệp: • Mô tả cách thức tổ chức lưu trữ thông tin. – Cấu trúc thông dụng nhất là cấu trúc cây. • Đường dẫn: truy nhập tới tệp theo đường đi trên cây tính từ gốc. • Thẻ tệp: truy nhập tới tệp theo số hiệu tệp. – Là một số nguyên được HĐH cung cấp cho tệp khi tạo hay mở tệp. – Các thông tin về tệp (đã mở): mô tả đặc điểm của tệp • Các thuộc tính của tệp : cờ trạng thái đọc/ghi. – C++ sử dụng các hằng S_IREAD, S_IWRITE ( đọc, ghi ). – Để kiểm tra các thuộc tính này, sử dụng hàm access(). • Kích thước và trạng thái : cho biết số byte và trạng thái của tệp. – Sử dụng các hàm như filelength, chsize, … • Chế độ truyền: kiểu nhị phân hay kiểu văn bản. 4 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  5. 5.1 Luång d÷ liÖu vµ tËp tin 5.1.3 Thao tác vào/ra với tập tin – Các kiểu vào/ra với tệp: • Mức cao (qua vùng đệm) và mức thấp (không qua vùng đệm) – C++ không cung cấp cơ chế vào/ra sử dụng các hàm vào/ra trong các thư viện do trình dịch cung cấp. • Vào/ra mức cao ~ qua vùng đệm: sử dụng bộ đệm (vùng nhớ trung gian) do chương trình (thực chất là trình dịch) cung cấp. • Vào/ra mức thấp ~ trực tiếp ~ mức hệ thống (tuy nhiên vẫn có bộ đệm do HĐH cung cấp). – Thư viện hỗ trợ vào/ra: stdio.h • Tùy theo kiểu vào/ra sử dụng các thư viện thích hợp • Tùy vào việc gắn các hàm này với thiết bị vào/ra nào, dữ liệu sẽ được chuyển từ/đến thiết bị đó (màn hình, bàn phím, tệp, …) 5 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  6. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.1 Khái niệm chung – Con trỏ tệp: • Là con trỏ kiểu FILE – Trỏ tới vùng nhớ chứa thông tin xác định đặc tính tệp. – Các đặc tính này bao gồm: tên, trạng thái, vị trí hiện thời của con trỏ. VD: FILE *fp1, *fp2; • Con trỏ tệp xác định một tệp trên bộ nhớ ngoài tương ứng với một kênh nhập/xuất và liên kết chúng với nhau. – Các thao tác vào/ra cơ bản: • Mở, đóng tệp, đọc, ghi dữ liệu, … – Chú ý các chế độ truy nhập: r, w, a, r+, … • Các hàm thông dụng: fopen, fclose, putc, getc, … • Các hàm khác: xem TLTK. 6 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  7. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.2 Các hàm vào/ra mức cao – Các hàm cơ bản: fopen: mở tệp, tham số là đường dẫn tệp và chế độ truy nhập. VD: fp1 = fopen("C:\\VIDU\\VD1.TXT","rb"); char fn[20]; gets(fn); fp2 = fopen(fn,"wt"); fclose: đóng tệp, tham số là con trỏ tệp. VD: fp1 = fclose(fp1); – Các chế độ truy nhập cho hàm fopen: “r”: mở tệp chỉ đọc, lỗi nếu tệp không tồn tại. “w”: mở tệp để ghi, nếu tệp đã tồn tại, nội dung sẽ bị xóa hết. “r+”: mở tệp để đọc và ghi, lỗi nếu tệp không tồn tại. “a”, “a+”: mở tệp ghi thêm dữ liệu vào cuối, tệp sẽ được tạo mới nếu chưa tồn tại. 7 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  8. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.2 Các hàm vào/ra mức cao – Các hàm cơ bản (tiếp) getc, fgetc: đọc kí tự từ tệp, tham số là con trỏ tệp. putc, fputc: ghi kí tự lên tệp, tham số là kí tự và con trỏ tệp. VD: int c; //hoặc char c; c = getc(fp1); putc(c, fp2); fputc(10, fp2); feof: kiểm tra cuối tệp, tham số là con trỏ tệp. VD: int kt = feof(fp1); fflush: làm sạch bộ đệm, tham số là con trỏ tệp. VD: fflush(fp1); – Các hàm cơ bản khác: xem TLTK. 8 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  9. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.2 Các hàm vào/ra mức cao – Các hàm đọc/ghi dữ liệu cho kiểu văn bản: fgets: đọc xâu kí tự từ tệp. fputs: ghi xâu kí tự lên tệp. VD: char d[256]; fgets(d, 256, fp1); fputs(d, fp2); fscanf: đọc dữ liệu theo khuôn dạng từ kênh nhập/xuất (thường là tệp). fprintf: ghi dữ liệu theo khuôn dạng lên kênh nhập/xuất (thường là tệp). VD: float x, y; fscanf(fp1, "%f%f", &x, &y); fprintf(fp2, “(%5.2f, %4.3f)\n", x, y); – Các hàm dùng cho kiểu văn bản khác: xem TLTK 9 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  10. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.2 Các hàm vào/ra mức cao – Các hàm đọc/ghi dữ liệu cho kiểu nhị phân: getw: đọc số nguyên từ tệp. putw: ghi số nguyên lên tệp. VD: int i; i = getw(f); putw(i, fp1); fread: đọc dữ liệu theo khối từ kênh nhập/xuất (thường là tệp). fwrite: ghi dữ liệu theo khối lên kênh nhập/xuất (thường là tệp). VD: char c[100]; fread(c, 1, 100, fp1); fwrite(c, 1, 100, fp2); – Các hàm dùng cho kiểu nhị phân khác: xem TLTK 10 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  11. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.3 Vào/ra ngẫu nhiên – Truy nhập ngẫu nhiên: thao tác với con trỏ tệp • Con trỏ chỉ vị trí của tệp có thể trỏ đến vị trí bất kì trên tệp. • Các hằng chỉ vị: SEEK_SET ~ 0, SEEK_CUR ~ 1, SEEK_END ~ 2. • Các hàm thông dụng: fseek, ftell. – Các hàm thông dụng: fseek: trỏ đến vị trí mới tính theo byte, sử dụng con trỏ tệp. VD: fseek(fp, 0, SEEK_END); ftell: trả về vị trí hiện thời, sử dụng con trỏ tệp. VD: int n; n = ftell(fp); – Các hàm vào/ra ngẫu nhiên khác: xem TLTK. 11 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  12. 5.2 Thao t¸c vµo/ra tÖp møc cao 5.2.4 Cài đặt các thao tác vào/ra dữ liệu Bài tập lớn! – Đọc các tài liệu có liên quan – Lập trình cài đặt • Cài đặt các thao tác vào/ra với nguồn dữ liệu xác định kết hợp với các BTL số 1 và số 2 (xem chương 3). • Chú ý đến tính chính xác và hợp lý của việc lưu trữ và truy xuất dữ liệu trên tệp. • Có thể sử dụng thêm các hàm vào/ra tệp mức thấp nếu cần (xem mục 5.3 tiếp theo). – Có thể xây dựng thành một hệ quản trị CSDL đơn giản ! • Ví dụ, quy định việc lưu trữ, truy xuất (sắp xếp, tìm kiếm, …) dữ liệu theo một quy cách nhất định. 12 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  13. 5.2 Thao t¸c vµo/ra tÖp møc thÊp 5.3.1 Khái niệm chung – Vào/ra tập tin mức thấp: • Còn gọi là hệ thống vào/ra mức I, hệ thống vào/ra giống UNIX hay hệ thống vào/ra không được cung cấp vùng đệm. – Về nguyên tắc, các hàm này không được định nghĩa trong ANSI C. – Các hàm vào/ra mức thấp là cơ sở để xây dựng các hàm vào/ra mức cao việc tìm hiểu chúng vẫn có ý nghĩa nhất định. • Duy trì tính kế thừa và khả năng tương thích: – Tính lịch sử: C phát triển trên nền UNIX, sau đó mở rộng sang các nền khác giữ lại các thao tác vào/ra mức thấp để duy trì tính kế thừa và khả năng tương thích. – C++ bao trùm lên C, ngoài các phương thức mới, vẫn sử dụng lại các thao tác vào/ra của C. • Gần gũi với các thao tác truy xuất của máy: – Chương trình dùng các hàm này sẽ hiệu quả hơn, nhanh hơn song làm việc với chúng khó và phức tạp hơn. 13 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  14. 5.2 Thao t¸c vµo/ra tÖp møc thÊp 5.3.2 Các hàm vào/ra mức thấp thông dụng – Tập tin tiêu đề và biến chuẩn • Sử dụng các tệp tiêu đề: io.h, fcntl.h, errno.h, sys/stat.h, dos.h, … – Sử dụng biến chuẩn (của Turbo C) _fmode cho phép xác định kiểu nhập/xuất (nhị phân hay văn bản). • Vào/ra sử dụng thẻ tệp: – Hệ thống vào/ra mức II sử dụng kênh xuất/nhập và con trỏ tệp. – Các hàm thông dụng: open, close: mở, đóng tệp (sử dụng các chế độ truy nhập). _open, _close: liên quan tới DOS. read, write: đọc, ghi dữ liệu. lseek: truy nhập tệp theo chỉ mục. unlink: xóa tệp. • Cách sử dụng: xem TLTK. – Các hàm khác: xem TLTK. 14 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  15. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Khái niệm chung • Tập hợp thanh ghi của bộ VXL 8086 – Thanh ghi công dụng chung (16 bit) : AX, BX, CX, DX. • Phân thành các thanh ghi 8 bit : AH, AL; BH, BL; CH, CL; DH, DL. – Thanh ghi đoạn (16 bit): lưu giữ con trỏ đoạn (CS, DS, SS, ES) – Thanh ghi độ lệch (16 bit): lưu giữ con trỏ độ lệch (IP, SP, BP, SI,DI) • Thanh ghi IP phối hợp với các thanh ghi đoạn địa chỉ bộ nhớ kiểu đoạn:độ lệch (segment : offset). – Thanh ghi cờ (flag): chứa 9 cờ (mỗi cờ 1 bit): O, D, I, T, S, Z, A, P, C. • Tổ chức địa chỉ bộ nhớ trong bộ VXL 8086 – Sử dụng kiến trúc bộ nhớ phân đoạn • Cú pháp biểu diễn : đoạn : độ_lệch (segment (2 byte) : offset (2 byte)) – Địa chỉ bộ nhớ gồm các đoạn, mỗi đoạn có độ lớn từ 1 – 64 KB. • Chuyển đổi : địa chỉ thực = đoạn * 16 + độ lệch. 15 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  16. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Ngắt và xử lý ngắt • Khái niệm chung về ngắt: – Ngắt là loại tín hiệu đặc biệt được gửi tới bộ VXL. – Khi nhận được một tín hiệu ngắt, CPU dừng công việc đang làm, quay sang thực thi một đoạn mã (được gọi là trình thực hiện ngắt), sau đó quay lại tiếp tục thực hiện công việc trước đó. • Phân loại ngắt: – Ngắt mềm: xuất hiện khi chương trình thực hiện một lệnh ngắt (INT) ~ một dạng đặc biệt của hàm. – Ngắt cứng: xuất hiện khi các thiết bị ngoại vi cần được phục vụ (ví dụ: người dùng ấn một phím, kết thúc việc đọc đĩa, …). 16 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  17. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Ngắt và xử lý ngắt (tiếp) • Thứ tự ưu tiên của ngắt: – Ngắt có thứ trự ưu tiên cao sẽ được CPU thực hiện trước. – Ưu tiên cao nhất dành cho ngắt không che được (NMI). Ngắt loại này cảnh báo CPU về một lỗi phần cứng nghiêm trọng. • Bảng véctơ ngắt: – Bảng véctơ ngắt (IVT) chứa địa chỉ của thao tác sẽ được thực hiện (khi ngắt tương ứng được sinh ra). Chi tiết hơn xem TLTK. – Có tất cả 256 ngắt, mỗi ngắt chiếm 4 byte bộ nhớ tổng cộng 1KB. Chúng chiếm địa chỉ từ 0x00 đến 0xFF. – Có thể có nhiều dịch vụ con gắn với một ngắt, chúng cũng được đánh số trong hệ 16. 17 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  18. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Ngắt và xử lý ngắt (tiếp) • Các dịch vụ của DOS và BIOS: – BIOS cung cấp các hàm mức thấp (mức hệ thống) để truy nhập vào phần cứng của hệ thống. Việc gọi một dịch vụ của BIOS có tác động như nhau trên tất cả các máy PC (kết quả cuối cùng là như nhau). – DOS (cũng như các HĐH khác) cung cấp các hàm mức cao (mức HĐH) để truy nhập vào phần cứng của hệ thống. Các dịch vụ này dựa cơ sở trên các dịch vụ của BIOS, chúng phức tạp hơn và có nhiều chức năng hơn (Tất nhiên chúng phải gọi tới các hàm của BIOS để hoàn thành công việc của mình). 18 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  19. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Xử lý ngắt mềm • Thủ tục xử lý: – Mỗi ngắt mềm được xác định bởi một cặp 2 số nguyên hệ 16, số hiệu và chức năng. – Các bước cơ bản để gọi ngắt: đặt số hiệu chức năng vào AH ; xác định các tham số đầu vào, đưa chúng vào các thanh ghi theo yêu cầu của mỗi ngắt ; thực hiện câu lệnh gọi ngắt theo số hiệu ngắt ; lấy kết quả do ngắt sinh ra (tham số đầu ra) từ các thanh ghi. – Có 2 phương pháp chủ yếu để gọi ngắt : (sử dụng các hàm khác nhau trong thư viện dos.h). • Phương pháp gọi ngắt dùng hàm geninterrupt : – Sử dụng các biến giả thanh ghi: _FLAGS, _AX, _AH, _AL, _BX, … – Gọi hàm : void geninterrupt ( int sh_ngắt ); 19 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  20. 5.4 Giao tiÕp víi hÖ thèng 5.4.1 Giao tiếp với hệ thống sử dụng thư viện dos.h – Xử lý ngắt mềm (tiếp) • Phương pháp gọi ngắt dùng các hàm int86, int86x, intdos, intdosx : – Sử dụng các cấu trúc, hợp: BYTEREGS, WORDREGS, REGS, SREGS, REGPACK. – Gọi hàm: int int86 ( int sh_ngắt, REGS *v, REGS *r); int int86x ( int sh_ngắt, REGS *v, REGS *r, SREGS *s); • Sử dụng hàm void segread (SREGS *s) để đặt nội dung các thanh ghi đoạn vào cấu trúc s (thường dùng để chuẩn bị cho hàm int86x) – Gọi hàm: int intdos (REGS *v, REGS *r); int intdosx (REGS *v, REGS *r, SREGS *s); – Các hàm này thực hiện ngắt 0x21 của DOS (kích hoạt một hàm tương ứng của DOS thông qua giá trị của v->h.ah ). • Thực chất các hàm này là hàm int86 (int86x) với số hiệu ngắt là 0x21. • Sử dụng hàm void intr ( int sh_ngắt, REGPACK *reg) để thực hiện ngắt sh_ngắt. Các tham số vào/ra đều được xác định qua reg. 20 Bài giảng C++. 15/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2