Xuất nhập (input/output)

Slides:



Advertisements
Các bản thuyết trình tương tự
Teen Challenge Staff Training Course
Advertisements

CHÚA NHẬT 33 MÙA THƯỜNG NIÊN NĂM B
CHÚA NHẬT 20 MÙA THƯỜNG NIÊN NĂM A TWENTIETH SUNDAY IN ORDINARY TIME
LỄ ĐỨC MARIA LÀ MẸ THIÊN CHÚA
Chương 2: Các kỹ thuật xây dựng chương trình phần mềm
Các nguyên tắc làm việc với ASP
Lễ Chúa Giêsu Lên Trời Năm C
Kính chào quý thầy cô và các em
Tiêu đề Mẫu Powerpoint Thêm tiêu đề L.O.G.O.
PHÒNG TÀI NGUYÊN VÀ MÔI TRƯỜNG CÁC CÔNG TÁC BẢO VỆ MÔI TRƯỜNG
CÂU LỆNH MẶC ĐỊNH MENU MÃ LỆNH M VÍ DỤ THAO TÁC TẠO PROGRAM
CHÚA NHẬT 29 MÙA THƯỜNG NIÊN
“Khi Chúa Giêsu đã chịu phép rửa và đang cầu nguyện, thì trời mở ra”.
CÁC HÀM CƠ BẢN TRONG EXCEL (1)
Kiểm thử và đảm bảo chất lượng phần mềm
Chương 3 Exception.
Xinh đẹp! Beautiful!.
CHÚA NHẬT PHỤC SINH NĂM B EASTER SUNDAY
LỄ CHÚA THÁNH THẦN HIỆN XUỐNG
TWENTY-FIFTH SUNDAY IN ORDINARY TIME
CHÚA NHẬT 19 MÙA THƯỜNG NIÊN
Chúa Nhật 13 Thường Niên Năm C Hùng Phương & Thanh Quảng thực hiện
Dạy những học viên đọc kém Teaching Students with Low Reading Levels
Lê Tân Bộ môn: Lập trình máy tính
Sáng tác: MS David Dong 2007.
Chương 3 – Các kỹ thuật gỡ lỗi và kiểm thử chương trình
THE HOLY FAMILY OF JESUS, MARY AND JOSEPH
Giới thiệu môn học.
Ôn tập struct và bộ nhớ động Linked Lists
Đứng Vững & Giữ Chặt Stand Firm & Hold Fast
AN TOÀN ĐIỆN TRONG XÂY DỰNG
Class & Struct II Lập trình nâng cao.
Con trỏ Lập trình nâng cao
Bài 3: Ngôn ngữ lập trình C#
Chương 02 CẤU TRÚC VÀ CÁC THÀNH PHẦN CHƯƠNG TRÌNH C/C++
CHƯƠNG II: CHUẨN ETHERNET
BS ĐOÀN XUÂN DUNG Phòng CT-MRI
Chương 06 KIỂU DỮ LIỆU NGƯỜI LẬP TRÌNH ĐỊNH NGHĨA
Hiểu Biết về Kết Quả SBAC CAASPP – California Assessment of Student Performance and Progress (Đánh Giá của California về Thành Quả và Tiến.
CHÚA NHẬT 5 MÙA THƯỜNG NIÊN
17th Sunday in Ordinary Time - Year C Chúa Nhật 17 Thường Niên Năm C
THE NATIVITY OF THE LORD CHRISTMAS
Chương 2 Đại cương về máy tính điện tử (MTĐT)
CHÚA GIÊSU, ĐỨC MARIA VÀ THÁNH GIUSE.
Maria thì ghi nhớ tất cả những việc đó và suy niệm trong lòng
PALM SUNDAY OF THE LORD’S PASSION
SỬ DỤNG LỆNH LẶP WHILE...DO
Chương 03 TỔ CHỨC DỮ LIỆU TRONG CHƯƠNG TRÌNH
Tin Mừng Chúa Giêsu Kitô theo Thánh Matthêu.
BÀI TẬP THỰC HÀNH 3 SỬ DỤNG LỆNH LẶP FOR...DO.
LỄ ĐỨC MARIA, MẸ THIÊN CHÚA MARY, THE HOLY MOTHER OF GOD
NHẬP MÔN LẬP TRÌNH MẢNG MỘT CHIỀU.
Bit, Byte, Biểu diễn thông tin
Trainer: Bạch Ngọc Toàn Phát hành bởi: TEDU –
SẮP XẾP, TÌM KIẾM, LỌC DỮ LIỆU
Đề kiểm tra 15’ lớp K58B Cho đồ thị không gian trạng thái của bài toán như sau: Trạng thái đầu: A Trạng thái đích: P Và cho giải thuật tìm kiếm theo chiều.
CHÚA NHẬT LỄ LÁ NĂM C PALM SUNDAY
Nhập môn Công nghệ học Phần mềm Introduction to Software Engineering
LỄ THĂNG THIÊN THE ASCENSION OF THE LORD.
Trainer: Bạch Ngọc Toàn Phát hành bởi: TEDU –
"Đang khi cầu nguyện, diện mạo Người biến đổi khác thường".
TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN
Mục tiêu Ưu điểm của ADO.NET Kiến trúc của ADO.NET
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU SQL SERVER 2012
KIỂM TRA TÌNH TRẠNG SAO CHÉP
CHÚA NHẬT 3 MÙA VỌNG. C "Còn chúng tôi, chúng tôi phải làm gì?"
Hàm Lập trình nâng cao.
Bản ghi của bản thuyết trình:

Xuất nhập (input/output) EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Khái niệm Người lập trình thường xuyên phải làm việc với một số thiết bị vào ra như màn hình, bàn phím, file, máy in,… Với mỗi chương trình, có: Đầu ra chuẩn stdout: mặc định là màn hình console, nhưng có thể được coi như một file ảo chỉ ghi, và có thể định nghĩa lại là một file trên đĩa hoặc máy in Đầu ra chuẩn cho lỗi stderr: tương tự stdout, nhưng thường dùng để ghi các dòng lỗi gặp phải trong chương trình Đầu vào chuẩn stdin: mặc định là bàn phím, nhưng có thể được coi như một file ảo chỉ đọc, và có thể định nghĩa lại là một file trên đĩa <cstdio> <stdio.h> EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Mở đầu Xuất ra stdout Nhập từ stdin Xuất một ký tự: int putchar(int c); Xuất một dòng ký tự: int puts(const char* s); Xuất một chuỗi theo định dạng: int printf(const char* format, ...); Nhập từ stdin Đọc một ký tự: int getchar(); Đọc một dòng ký tự: char* gets(char* s); Đọc một chuỗi theo định dạng: int scanf(const char* format, ...); EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Xuất nhập từ file Kiểu file: typedef struct { … } FILE; Trình tự thao tác với file: Mở/tạo file  Đọc/ghi dữ liệu  Đóng Trong kiểu FILE có trường lưu thông tin vị trí đang đọc/ghi của file, gọi là con trỏ file Mở file: FILE* fopen(const char* fname, const char* mode); mode Ý nghĩa "r" Chỉ cho phép đọc "r+" Cho phép đọc và ghi "w" Chỉ cho phép ghi, xoá nội dung file cũ nếu có hoặc tạo file mới nếu chưa có "w+" Cho phép đọc và ghi, xoá nội dung file cũ nếu có hoặc tạo file mới nếu chưa có "a" Chỉ cho phép ghi, trỏ con trỏ đến cuối file để ghi tiếp hoặc tạo file mới nếu chưa có "a+" Cho phép đọc và ghi, trỏ con trỏ tới cuối file để ghi tiếp hoặc tạo file mới nếu chưa có "t" Đọc/ghi dạng văn bản (text) "b" Đọc/ghi dạng nhị phân (binary) EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Chú ý với việc mở file Việc mở file có thể không thành công và trả về NULL  cần kiểm tra giá trị trả về của fopen() để biết đã mở file thành công không Các lý do có thể khiến mở file không thành công: Mở file để đọc mà file đó không tồn tại Người dùng hiện tại không có quyền File đang được mở với chế độ hạn chế bởi một chương trình nào đó Có quá nhiều file đang mở (hệ điều hành có giới hạn số file được mở đồng thời) Các file được mở với hàm fopen() không hạn chế được mở lại EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Mở file và hạn chế mở lại Đôi khi ta không muốn chương trình khác can thiệp vào một file ta đang mở để đọc/ghi FILE* _fsopen(const char* fname, const char* mode, int shflag); shflag: cờ cho phép file được mở lại hay không #include <share.h> Lưu ý: Hàm này chỉ có trong MS Visual C shflag Ý nghĩa _SH_DENYNO Không hạn chế _SH_DENYRD Hạn chế được mở lại với chế độ đọc _SH_DENYWR Hạn chế được mở lại với chế độ ghi _SH_DENYRW Hạn chế được mở lại với cả chế độ đọc và ghi EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Ghi vào file File văn bản (text) và nhị phân (binary) File văn bản: một số ký tự đặc biệt như chuyển đổi giữa '\n' và "\r\n", xử lý ký tự hết file  thích hợp file dạng văn bản File nhị phân: không thay đổi dữ liệu ghi vào  thích hợp với việc lưu dữ liệu dạng nhị phân Ghi chuỗi (file văn bản): int fputc(int c, FILE* file); int fputs(const char* s, FILE* file); int fprintf(FILE* file, const char* format, ...); Dùng tương tự các hàm putchar(), puts(), printf() Ghi dữ liệu (file nhị phân): int fwrite(const void* buf, int size, int count, FILE* file); Ghi một mảng với count phần tử, kích thước mỗi phần tử là size EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Đọc từ file Đọc hàm fgets() có kiểm tra giới hạn dữ liệu. Hàm fgetc() trchuỗi: int fgetc(FILE* file); int fgets(char* s, int n, FILE* file); int fscanf(FILE* file, const char* format, ...); Dùng tương tự các hàm getchar(), gets(), scanf() nhưng trả về EOF nếu đã kết thúc file. Đọc dữ liệu: int fread(void* buf, int size, int count, FILE* file); Đọc một mảng với count phần tử, kích thước mỗi phần tử là size Kiểm tra kết thúc file hay chưa: int feof(FILE* file); Vì việc đọc/ghi file có sử dụng bộ đệm, nên thường phải dùng hàm fflush() để làm sạch bộ đệm trước khi chuyển từ ghi sang đọc, hoặc từ đọc sang ghi nếu mở file ở chế độ đọc và ghi đồng thời int fflush(FILE* file); fgets Get string from stream Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the End-of-File is reached, whichever comes first. A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str. A null character is automatically appended in str after the characters read to signal the end of the C string. Parameters str Pointer to an array of chars where the string read is stored. num Maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used. stream Pointer to a FILE object that identifies the stream where characters are read from. To read from the standard input, stdin can be used for this parameter. Return Value On success, the function returns the same str parameter. If the End-of-File is encountered and no characters have been read, the contents of str remain unchanged and a null pointer is returned. If an error occurs, a null pointer is returned. Use either ferror or feof to check whether an error happened or the End-of-File was reached. fread tra ve so phan tu doc duoc ??? EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Các hàm khác về đọc/ghi file Đóng file: int fclose(FILE* file); Chuyển con trỏ file: void rewind(FILE* file); int fseek(FILE* file, long offs, int org); org = SEEK_CUR: tính từ vị trí hiện tại org = SEEK_END: tính từ cuối file org = SEEK_SET: giá trị tuyệt đối (tính từ đầu file) Ví trí hiện tại của con trỏ: long ftell(FILE* file); Xoá file: int remove(const char* path); Đổi tên và chuyển file: int rename(const char* old, const char* new); void rewind ( FILE * stream ); Set position indicator to the beginning Sets the position indicator associated with stream to the beginning of the file. A call to rewind is equivalent to: fseek ( stream , 0L , SEEK_SET ); except that, unlike fseek, rewind clears the error indicator. On streams open for update (read+write), a call to rewind allows to switch between reading and writing. /* rewind example */ #include <stdio.h> int main () { int n; FILE * pFile; char buffer [27]; pFile = fopen ("myfile.txt","w+"); for ( n='A' ; n<='Z' ; n++) fputc ( n, pFile); rewind (pFile); fread (buffer,1,26,pFile); fclose (pFile); buffer[26]='\0'; puts (buffer); return 0; } A file called myfile.txt is created for reading and writing and filled with the alphabet. The file is then rewinded, read and its content is stored in a buffer, that then is written to the standard output: ABCDEFGHIJKLMNOPQRSTUVWXYZ Fseek tra ve 0/1 : thanh cong/that bai EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Ví dụ: Ghi/đọc một file text #include <stdio.h> main() { FILE *fp; fp = fopen("/tmp/test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); } FILE *fp; char buff[255]; fp = fopen("/tmp/test.txt", "r"); fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Ví dụ: hàm copy file int copy_file(const char* src, const char* dst) { FILE *fs = NULL, *fd = NULL; char buf[1024]; int num; if ((fs = fopen(src,"rb")) == NULL) return -1; if ((fd = fopen(dst,"wb")) == NULL) { fclose(fs); return -1; } while(!feof(fs)) { num = fread(buf, 1, sizeof(buf), fs); fwrite(buf, 1, num, fd); } fclose(fs); fclose(fd); return 0; EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

stdin, stdout, stderr Đầu vào/ra chuẩn thực chất là các biến kiểu FILE* được định nghĩa sẵn, nên việc đọc/ghi với các hàm printf(…), scanf(…) tương đương với việc dùng fprintf(stdout,…) và fscanf(stdin,…) Tương tự với các hàm putchar(), puts(), getchar(), gets() cũng thực hiện việc đọc/ghi trên stdin và stdout Định hướng lại đầu vào/ra chuẩn: Ký hiệu Ý nghĩa command > file command 1> file Đổi stdout ra file command 2> file Đổi stderr ra file command >> file command 1>> file Đổi stdout ra file và nối tiếp vào file đó command 2>> file Đổi stderr ra file và nối tiếp vào file đó command < file Đổi stdin từ file command1 | command2 Đổi stdout của command1 thành stdin của command2 EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

stdin, stdout, stderr (tiếp) Một số file đặc biệt Ví dụ: Dẫn hướng cả stdout và stderr vào file result.txt C:\>dir *.dat >result.txt 2>&1 Dẫn hướng cả stdout ra máy in và stderr vào file error.log C:\>stuff >prn 2>error.log Dẫn hướng đầu vào từ file input.txt và đầu ra là file output.txt C:\>process <input.txt >output.txt Tạo pipe (output của lệnh nọ là input của lệnh kia) C:\>type source.c | more Tên file Ý nghĩa &0 stdin nul Bỏ qua &1 stdout prn, lpt1 Máy in &2 stderr con Màn hình EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Đọc/ghi trên bộ nhớ Ghi: Đọc: sprintf(char* buffer, const char* format, ...); Đọc: sscanf(const char* buffer, const char* format, ...); Dùng tương tự như fprintf() và fscanf() nhưng dữ liệu được lưu vào một vùng nhớ xác định trong tham số buffer Ví dụ: char s[50]; sprintf(s, "sin(pi/3) = %.3f", sin(3.14/3)); Kết quả: s sẽ chứa chuỗi "sin(pi/3) = 0.866" EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Đọc/ghi an toàn EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Lỗi tràn bộ đệm Xảy ra khi chương trình ghi dữ liệu vào một biến nhiều hơn kích thước của nó Ví dụ: copy một chuỗi 10 ký tự vào biến chỉ dài 5 ký tự char s[5]; strcpy(s, "0123456789"); Lỗi tràn bộ đệm rất nguy hiểm vì gây ra những lỗi không dự đoán trước, đặc biệt có thể khiến người sử dụng kiểm soát máy tính và làm bất cứ gì Cần kiểm soát chiều dài của dữ liệu nhập so với vùng nhớ được cấp phát cho các biến Các hàm chuẩn của C không kiểm tra lỗi tràn bộ đệm  sử dụng các hàm mở rộng trong Visual C từ 2005 EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Các hàm về chuỗi và bộ nhớ memcpy_s(void* dest, int size, const void* src, int count); memmove_s(void* dest, int size, const void* src, int count); strcpy_s(char* dest, int size, const char* src); strcat_s(char* dest, int size, const char* src); _strlwr_s(char* str, int size); _strupr_s(char* str, int size); Visual C tu 2005. Int size bien moi, la kich thuoc cua vung nho (dich) EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Các hàm đọc dữ liệu gets_s(char* str, int size); scanf_s(const char* format, …); Thêm các tham số kiểm tra kích thước biến với chuỗi và ký tự int i; float f; char c; char s[10]; scanf_s("%d %f %c %s", &i, &f, &c, 1, s, 10); Tương tự với các hàm fscanf_s(), sscanf_s() EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Bài tập Viết chương trình đổi các ký tự trong một file sang chữ hoa (tên file từ tham số dòng lệnh) Viết chương trình đếm số từ và số dòng trong một file (quy ước từ cách nhau bởi một trong các ký tự: cách, tab, xuống dòng) Viết chương trình nối một file vào một file khác Viết chương trình in ra màn hình dòng thứ 10 của một file Viết chương trình chèn một dòng vào dòng thứ 10 của một file Viết chương trình nhập dữ liệu cho cấu trúc SinhVien từ bàn phím, sau đó thử thay đổi stdin và stdout từ file và xem kết quả Viết một hàm trả về kích thước của một file 1, 3, 4, 6: nhap tu ban phim, cau truc vao file EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Sửa lỗi Sử dụng fgets với kiểm lỗi: EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội