Bài giảng Kỹ thuật lập trình hệ cơ điện tử: Chương 8 - Vào ra trong C được biên soạn bao gồm các nội dung chính sau: Vào ra chuẩn – getchar và putchar; In ra theo khuôn dạng; Nhập vào theo khuôn dạng; Chuyển dạng trong bộ nhớ; Xử lý tệp; Một số hàm tiện ích. Mời các bạn cùng tham khảo bài giảng!
Trang 1K THU T L P TRÌNH H C ĐI N Ỹ Ậ Ậ Ệ Ơ Ệ TỬ
Trang 21. T ng quan v ngôn ng l p trìnhổ ề ữ ậ
2. Gi i thi u s b ngôn ng Cớ ệ ơ ộ ữ
3. Ki u, toán t và bi u th c ể ử ể ứ
Trang 4Vào ra chu n – getchar và putchar ẩ
1 Vào ra chuẩn – getchar và putchar
- Mỗi tệp gốc có tham trỏ tới hàm thư viện chuẩn đều phải chứa:
• Thư viện chuẩn
- Vị trí ở chỗ bắt đầu chương trình
- Tệp stdio.h định nghĩa các macro và biến cùng các hàm
Trang 5Vào ra chu n – getchar và putchar ẩ
• Hàm getchar ()
- Cơ chế vào đơn giản nhất là đọc từng ký tự từ thiết bị vào chuẩn, nói chung là bàn phím và màn hình của người sử dụng, bằng hàm getchar()
- Dùng câu lệnh sau : biến = getchar();
Nhận một ký tự vào từ bàn phím và không đưa ra màn
hình Hàm sẽ trả về ký tự nhận được và lưu vào biến
• Ví dụ:
Trang 6Vào ra chu n – getchar và putchar ẩ
• Hàm putchar ()
- Để đưa một ký tự ra thiết bị ra chuẩn, nói chung là màn hình, ta sử dụng hàm putchar()
- Dùng câu lệnh sau : putchar(ch);
Đưa ký tự ch lên màn hình tại vị trí hiện tại của con trỏ Ký
tự sẽ được hiển thị với màu trắng
• Ví dụ:
Trang 7Khi gõ một ký tự thì hàm nhận ngay ký tự đó ( không cần bấm thêm phím Enter như trong các hàm nhập khác ) Ký
tự vừa gõ không hiện lên màn hình
• Ví dụ:
Trang 8Vào ra chu n – getchar và putchar ẩ
• Hàm putch()
- Đưa ký tự “ch” lên màn hình tại vị trí hiện tại của con trỏ
Ký tự sẽ được hiển thị theo màu xác định trong hàm textcolor Hàm cũng trả về ký tự được hiển thị
- Dùng câu lệnh sau : putch(ch);
Trang 9Đ a k t qu lên màn hình ư ế ả
2 Đưa kết quả lên màn hình
• Hàm printf(điều khiển, đối số 1, đối số 2, )
- Hàm printf chuyển, tạo khuôn dạng và in các đối của nó ra thiết bị ra chuẩn dưới sự điều khiển của xâu điều
khiển Xâu điều khiển chứa hai kiểu đối tượng: các ký tự thông thường, chúng sẽ được đưa ra trực tiếp thiết bị ra, và các đặc tả chuyển dạng, mỗi đặc tả sẽ tạo ra việc đổi dạng
và in đối tiếp sau của printf
Trang 10Đ a k t qu lên màn hình ư ế ả
• Chuỗi điều khiển có thể có các ký tự điều khiển
- \n sang dòng mới
- \f sang trang mới
- \b lùi lại một bước
- \t dấu tab
- Dạng tổng quát của đặc tả :
%[-][fw][.pp] ký tự chuyển dạng
Trang 11Đ a k t qu lên màn hình ư ế ả
- Khi không có dấu trừ thì kết quả ra
được dồn về bên phải nếu độ dài
thực tế của kết quả ra nhỏ hơn độ
rộng tối thiểu fw dành cho nó Các vị
trí dư thừa sẽ được lấp đầy bằng các
khoảng trống Riêng đối với các
trường số, nếu dãy số fw bắt đầu
bằng số 0 thì các vị trí dư thừa bên
trái sẽ được lấp đầy bằng các số 0
- Khi có dấu trừ thì kết quả được dồn
về bên trái và các vị trí dư thừa về
bên phải ( nếu có ) luôn được lấp
đầy bằng các khoảng trống
Trang 12Đ a k t qu lên màn hình ư ế ả
- Khi fw lớn hơn độ dài thực tế của kết quả ra thì các vị trí
dư thừa sẽ được lấp đầy bởi các khoảng trống hoặc số 0
và nội dung của kết quả ra sẽ được đẩy về bên phải hoặc bên trái
Trang 13Đ a k t qu lên màn hình ư ế ả
• pp:
- Tham số pp chỉ được sử dụng khi đối tương ứng là một xâu ký tự hoặc một giá trị kiểu float hay double
- Trong trường hợp đối
tương ứng có giá trị kiểu
float hay double thì pp là
Trang 14Ký t chuy n d ng ự ể ạ
3 Ký tự chuyển dạng
- Ký tự chuyển dạng là một hoặc một dãy ký hiệu xác định quy tắc chuyển dạng và dạng in ra của đối tương ứng Như vậy sẽ có tình trạng cùng một số sẽ được in ra theo các dạng khác nhau
- Cần phải sử dụng các ký tự chuyển dạng theo đúng qui tắc định sẵn
- Mọi dãy ký tự không bắt đầu bằng % hoặc không kết thúc bằng ký tự chuyển dạng đều được xem là ký tự hiển thị
Trang 15Ký t chuy n d ng ự ể ạ
Trang 16Ký t chuy n d ng ự ể ạ
• Ví dụ:
Trang 17tự vv ) rồi lưu trữ nó vào bộ nhớ theo các địa chỉ xác định.
- scanf(điều khiển,đối 1, đối 2, );
%[*][d d]ký tự chuyển dạng
- dấu * nói lên rằng trường vào vẫn được dò đọc bình
thường, nhưng giá trị của nó bị bỏ qua ( không được lưu
vào bộ nhớ ) Như vậy đặc tả chứa dấu * sẽ không có đối tương ứng
Trang 19Nh p vào theo khuôn d ng ậ ạ
• Ký tự chuyển dạng:
- Ký tự chuyển dạng xác định cách thức dò đọc các ký tự trên dòng vào cũng như cách chuyển dịch thông tin đọc đựợc trước khi gán nó cho các địa chỉ tương ứng
- Cách dò đọc thứ nhất là đọc theo trường vào, khi đó các khoảng trắng bị bỏ qua Cách này áp dụng cho hầu hết các trường hợp
- Cách dò đọc thứ hai là đọc theo ký tự, khi đó các khoảng trắng cũng được xem xét bình đẳng như các ký tự khác Phương pháp này chỉ xảy ra khi ta sử dụng một trong ba ký
tự chuyển dạng sau : C, [ dãy ký tự ], [^ dãy ký tự ]
Trang 20Nh p vào theo khuôn d ng ậ ạ
Trang 22Nh p vào theo khuôn d ng ậ ạ
• Đưa kết quả ra máy in:
- Để đưa kết quả ra máy in ta dùng hàm chuẩn fprintf có dạng sau
- Tham số stdprn xác định thiết bị đưa ra là máy in
Điều khiển có dạng đặc tả như lệnh printf
Dùng giống như lệnh printf, chỉ khác là in ra máy in
Trang 23ofstream <Tên biến tệp>(<Tên tệp tin>, ios::out);.
- Ghi dữliệu vào tệp bằng thao tác “<<”:
<Tên biến tệp> <<<Dữliệu>;
- Đóng tệp tin bằng lệnh close():
<Tên biến tệp>.close();
Trang 24X lý t p ử ệ
Trang 27X lý t p ử ệ
Trang 28X lý t p ử ệ
- Minh hoạ việc copy toàn bộ nội dung của một tệp tin sang một tệp tin mới:
Trang 29X lý t p ử ệ
Trang 30X lý t p ử ệ
5.2 Vào ra tệp nhị phân bằng read và
write
• Ghi vào tệp nhị phân bằng write.
- Mở tệp tin theo chế độ để ghi nhị phân bằng đối tượng
fstream:
fstream <Tên biến tệp>(<Tên tệp tin>, ios::out|ios::binary);
- Ghi dữliệu vào tệp bằng thao tác “write()”:
<Tên biến tệp>.write(char* <Dữliệu>,
int <Kích thước dữliệu>);
- Đóng tệp tin bằng lệnh close():
Trang 31X lý t p ử ệ
- Thao tác write nhận hai tham số đầu vào như sau:
- Tham số thứ nhất là con trỏ kiểu char trỏ đến vùng dữ liệu cần ghi vào tệp Vì con trỏ bắt buộc có kiểu char nên khi muốn ghi dữ liệu có kiểu khác vào tệp, ta dùng hàm chuyển kiểu:
reinterpret_cast<char *>(<Dữliệu>);
- Tham sốthứhai là kích cỡ dữ liệu được ghi vào tệp Kích
cỡ này được tính theo byte, nên thông thường ta dùng toán tử:
sizeof(<Kiểu dữliệu>);
Trang 32X lý t p ử ệ
• Đọc dữ liệu từ tệp nhị phân bằng read.
- Mở tệp tin theo chế độ để đọc nhị phân bằng đối tượng fstream (mở tệp tin chỉ để ghi):
fstream <Tên biến tệp>(<Tên tệp tin>, ios::in|ios::binary);
- Đọc dữ liệu từ tệp bằng thao tác “read()”:
<Tên biến tệp>.read(char* <Dữliệu ra>,
int <Kích thước dữliệu>);
- Đóng tệp tin bằng lệnh close():
<Tên biến tệp>.close();
Trang 336 Truy nhập tệp trực tiếp
6.1 Con trỏ tệp tin
• Con trỏ tệp tin có vai trò như một đầu đọc trỏ vào một vị trí xác định của tệp và thao tác truy nhập tệp diễn ra tuần tự
- Tại mỗi thời điểm, con trỏ tệp tin xác định một vị trí trên tệp mà tại đó, thao tác truy nhập tệp (đọc/ghi) được thực hiện
- Sau thao tác truy nhập, con trỏ tệp tự động chuyển đến vị trí tiếp theo dựa vào kích thước đơn vị dữ liệu được truy nhập
Trang 34Truy nh p t p tr c ti p ậ ệ ự ế
• Cách truy nhập tệp tuần tự có nhược điểm là bao giờ cũng phải bắt đầu từ đầu tệp tin, đi tuần tự cho đến vị trí cần truy nhập Khi tệp tin có kích thước lớn thì cách truy nhập này rất tốn thời gian
• C++ cho phép truy nhập trực tiếp đến một vị trí xác định trên tệp tin bằng các phép toán:
- Truy nhập vị trí hiện tại của con trỏ tệp tin
- Dịch chuyển con trỏ tệp tin đến một vị trí xác định
Trang 35Truy nh p t p tr c ti p ậ ệ ự ế
6.2 Truy nhập vị trí hiện tại của con trỏ
tệp
- Nếu biến tệp là kiểu mở tệp để đọc ifstream thì cú pháp là:
<Tên biến tệp>.tellg();
- Nếu biến tệp là kiểu mở tệp để ghi ofstream thì cú pháp là:
<Tên biến tệp>.tellp();
Trang 36Truy nh p t p tr c ti p ậ ệ ự ế
Trang 37Truy nh p t p tr c ti p ậ ệ ự ế
Trang 38Truy nh p t p tr c ti p ậ ệ ự ế
6.3 Dịch chuyển con trỏ tệp
• Ngoài việc xác định vị trí hiện thời của con trỏ tệp, C++ còn cho phép dịch chuyển con trỏ tệp đến một vị trí bất kì trên tệp Cú pháp dịch chuyển phụ thuộc vào kiểu biến tệp là đọc hay ghi
- Nếu biến tệp có kiểu là mở tệp tin để đọc ifstream, cú pháp sẽ :
<Tên biến tệp>.seekg(<Kích thước>, <Mốc dịch chuyển>);
- Nếu biến tệp có kiểu là mở tệp để ghi ofstream, cú pháp
sẽ là:
Trang 39Truy nh p t p tr c ti p ậ ệ ự ế
với vị trí mốc dịch chuyển Đơn vị tính của kích thước là byte, có kiểu là số nguyên
dịch chuyển của con trỏ tệp Có ba tham số hằng về kiểu mốc dịch chuyển:
- ios::beg: Mốc dịch chuyển là đầu tệp tin
- ios::cur: Mốc dịch chuyển là vị trí hiện thời của con trỏ tệp
- ios::end: Mốc dịch chuyển là vị trí cuối cùng của tệp tin
Trang 41Truy nh p t p tr c ti p ậ ệ ự ế
Trang 42Truy nh p t p tr c ti p ậ ệ ự ế
Trang 43Truy nh p t p tr c ti p ậ ệ ự ế