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

Similar documents
Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Tài liệu hướng dẫn: Stored Procedure

SIEMENS INDUSTRIAL NETWORKS

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

Chương 5. Network Layer 19/09/2016 1

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

STACK và QUEUE. Lấy STACK

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

Tình huống 1: PPPoE với Username và Password

Nhấn nút New để tạo 1 biến mới Trang 17

Hướng dẫn cài đặt FPT

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

CẤU TRÚC DỮ LIỆU NÂNG CAO

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

Bài tập lớn số 1. Giả lập bộ định thời

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Các kiểu định địa chỉ họ MSC-51

BELGIUM ONLINE APPOINTMENT

SIMULATE AND CONTROL ROBOT

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Hệ điều hành Bài tập tuần 7_ Chúng ta làm quen một số lệnh thao tác với hệ thống file trong Linux :

I. Hướng Dẫn Đăng Nhập:

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Entity Framework (EF)

BẢO MẬT TRONG SQL SERVER

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

LÂ P TRI NH WEB ASP.NET

PHÁT TRIỂN ỨNG DỤNG WEB

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

THAO TÁC VỚI TẬP TIN TRONG C++

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Mô hình dữ liệu quan hệ (Relational data model)

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MINICHAT. Bài giảng 3. Trang1. Khoa Khoa Học Và Kỹ Thuật Máy Tính

Exceptions. Outline 7/31/2012. Exceptions. Exception handling is an important aspect of objectoriented. Chapter 10 focuses on:

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC

Tạo Project với MPLAB

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

TỔNG QUAN VỀ.NET VÀ C#

Bài 10: Cấu trúc dữ liệu

Cập nhật ResultSet trong JDBC

Đa ngôn ngữ (Internationalization) trong Servlet

LAB IP SLA Bài 1. Bùi Quốc Kỳ ***

Tìm hiểu Group Policy Object và các ví dụ

HƯỚNG DẪN SỬ DỤNG NHANH MINDJET MIND MANAGER

Bài 7: Các cấu trúc điều khiển

BÀI 4 GIAO TIẾP GIỮA CÁC TIẾN TRÌNH TRONG LINUX

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Bài thực hành số 2 QUYỀN và ROLE

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

HTML DOM - Forms. MSc. nguyenhominhduc

Lecture 12. Trees (1/2) Nội dung bài học:

Qu n ả tr h ố g t p ậ tin

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

Kiến trúc 8051 và giới thiệu về ngôn ngữ lập trình Assembly

GV: Phạm Đình Sắc or

Kích hoạt phương thức xa (RMI- Remote Method Invocation )

Dọn "rác" Windows 7 vào dịp cuối năm

MỤC LỤC. Giáo trình Thiết kế web Trang 1

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

JAVASCRIPT. Giảng viên : Ths. PHẠM ĐÀO MINH VŨ

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

Giao tiếp giữa các tiến trình

Module2: Lập trình Shell và C Quản lý tiến trình A. TÓM TẮT LÝ THUYẾT:

BÀI LAB ĐỔI TÊN DOMAIN

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Parallels Cloud Server 6.0

Hướng Dẫn Thực Hành Tập tin & Thư mục

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

BÀI 6a LẬP TRÌNH ĐA TUYẾN (MULTI THREAD)

Google Search Engine. 12/24/2014 Google Search Engine 1

Transcription:

Bài 6: Xuất nhập (input/output) 1

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 2

Mở đầu Xuất ra stdout 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,...); 3

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 mode Ý nghĩa "r" Chỉ cho phép đọc "r+" Cho phép đọc và ghi "w" "a" 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ó 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ó "w+" "a+" 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ó 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) 4

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 5

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> shflag _SH_DENYNO _SH_DENYRD _SH_DENYWR _SH_DENYRW Ý nghĩa Không hạn chế Hạn chế được mở lại với chế độ đọc Hạn chế được mở lại với chế độ ghi Hạn chế được mở lại với cả chế độ đọc và ghi Lưu ý: Hàm này chỉ có trong MS Visual C 6

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 dữ liệu text: 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 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 7

Đọc từ file 8 Đọc dữ liệu text: 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 nhị phân: 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);

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); 9

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); } } 10 fclose(fs); fclose(fd); return 0;

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 command > file command 1> file command 2> file command >> file command 1>> file command 2>> file command < file command1 command2 Ý nghĩa Đổi stdout ra file, tạo file mới hoặc xoá file cũ nếu đã có Đổi stderr ra file, tạo file mới hoặc xoá file cũ nếu đã có Đổi stdout ra file và nối tiếp vào file đó Đổi stderr ra file và nối tiếp vào file đó Đổi stdin từ file Đổi stdout của command1 thành stdin của command2 11

stdin, stdout, stderr (tiếp) Một số file đặc biệt Tên file Ý nghĩa Tên file Ý nghĩa &0 stdin nul Bỏ qua &1 stdout prn, lpt1-9 Máy in &2 stderr con Màn hình aux AUX port com1-9 COM ports Ví dụ: 12 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

Đọc/ghi trên bộ nhớ Ghi: Đọc: sprintf(char* buffer, const char* format,...); 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ụ: 13 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"

Đọc/ghi an toàn 14

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 */ 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 15

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); 16

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() 17

Bài tập 1. 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) 2. 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) 3. Viết chương trình nối một file vào một file khác 4. Viết chương trình in ra dòng thứ 10 của một file 5. Viết chương trình chèn một dòng vào dòng thứ 10 của một file 6. 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ả 7. Viết một hàm trả về kích thước của một file 18