1. Trang chủ
  2. » Cao đẳng - Đại học

Bài giảng kỹ thuật lập trình chương 4 Tập tin (file)

53 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Bài Giảng Kỹ Thuật Lập Trình Chương 4 Tập Tin (File)
Tác giả Trịnh Tấn Đạt
Người hướng dẫn TAN DAT TRINH, Ph.D.
Trường học Đại Học Sài Gòn
Chuyên ngành Khoa CNTT
Thể loại bài giảng
Năm xuất bản 2024
Thành phố Sài Gòn
Định dạng
Số trang 53
Dung lượng 793,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tập tin (FILE) Trịnh Tấn Đạt Khoa CNTT Đại Học Sài Gòn Email trinhtandatsgu edu vn Website https sites google comsitettdat88 Nội dung ▪ Khái niệm về Stream (luồng) ▪ Khái niệm về FILE ▪ Các thao tác cơ bản với file trong C o MởĐóng FILE o ĐọcGhi FILE o Con trỏ FILE o Binary FILE (option) o FILE và mảng ▪ Bài Tập ▪ Các thao tác cơ bản với file trong C ++ (tìm hiểu thêm option) Stream ▪ Dữ liệu trong chương trình (biến, mảng, cấu trúc, hàm, ) được lưu trữ tạm trong bộ nhớ RAM ▪ Dữ liệu đượ.

Trang 1

Tập tin (FILE)

Trịnh Tấn Đạt

Khoa CNTT - Đại Học Sài Gòn

Email: trinhtandat@sgu.edu.vn

Website: https://sites.google.com/site/ttdat88/

Trang 2

Nội dung

▪ Các thao tác cơ bản với file trong C

Trang 3

o Thiết bị nhập (input device): bàn phím, mouse, …

o Thiết bị xuất (output device): màn hình, máy in, …

o Thiết bị vừa nhập vừa xuất: tập tin

▪ Các thiết bị đều thực hiện mọi xử lý thông qua các luồng (stream).

Trang 4

▪ Hệ thống nhập/xuất của C cung cấp cho người dùng một môi trường độc lập với

thiết bị đang truy cập

▪ Môi trường này là một sự biểu diễn trừu tượng của thiết bị gọi là một stream và

thiết bị thật sự được gọi là tập tin (file)

▪ Stream: là một môi trường trung gian để giao tiếp (nhập/xuất thông tin) giữa

chương trình và thiết bị

▪ Muốn nhập/xuất thông tin cho một thiết bị chúng ta sẽ gửi thông tin cho stream

nối với thiết bị đó (độc lập với thiết bị)

▪ Stream là dãy byte dữ liệu:

o Input stream

o Output stream

Trang 5

❖ Stream chia thành 02 loại: stream văn bản và stream nhị phân

▪ Stream văn bản (text)

o Được đọc và ghi chính xác từng byte

o Xử lý dữ liệu bất kỳ, kể cả dữ liệu văn bản

o Được sử dụng chủ yếu với các tập tin trên đĩa

Trang 6

▪ Các stream chuẩn định nghĩa sẵn

Tên Stream Thiết bị tương ứng

stdin Nhập chuẩn Bàn phím stdout Xuất chuẩn Màn hình stderr Lỗi chuẩn Màn hình stdprn In chuẩn Máy in (LPT1:)

• Xuất ra màn hình: fprintf( stdout , "Hello");

• Xuất ra máy in: fprintf( stdprn , "Hello");

• Xuất ra thiết bị báo lỗi: fprintf( stderr , "Hello");

• Xuất ra tập tin (stream fp): fprintf( fp , "Hello");

Trang 7

FILE (tập tin)

▪ Theo định nghĩa trên Wikipedia về computer file: Một file trên máy

tính là một tài nguyên dùng để lưu trữ thông tin lâu dài, sử dụng cho các chương trình máy tính.

▪ Tại sao cần tập tin:

o Dữ liệu giới hạn và được lưu trữ tạm thời

• Nhập: gõ từ bàn phím.

• Xuất: hiển thị trên màn hình.

• Lưu trữ dữ liệu: trong bộ nhớ RAM.

 Mất thời gian, không giải quyết được bài toán với số dữ liệu lớn.

o Cần một thiết bị lưu trữ sao cho dữ liệu vẫn còn khi kết thúc chương trình, cóthể sử dụng nhiều lần và kích thước không hạn chế

Trang 8

▪ Trong ngôn ngữ lập trình C/C++: File là kiểu đối tượng chứa các thông tin cần

thiết để điều khiển, bao gồm một con trỏ trỏ đến buffer của nó, các chỉ mục vàtrạng thái của nó

▪ File là một kiểu dữ liệu có cấu trúc

▪ Là một dãy các byte ghi trên đĩa Số byte của dãy chính là độ dài của file

▪ Được lưu trữ trong các thiết bị lưu trữ ngoài như đĩa mềm, đĩa cứng, USB…

o Vẫn tồn tại khi chương trình kết thúc

o Kích thước không hạn chế (tùy vào thiết bị lưu trữ)

▪ Có hai kiểu nhập/xuất dữ liệu lên file: nhị phân và văn bản

▪ Làm việc với File chúng ta chỉ có các thao tác cơ bản như: tạo file mới, đọc dữ

liệu trong file, ghi dữ liệu vào file, xóa file

▪ Trong lập trình C, dùng thư viện <stdio.h> để thao tác trên FILE

Trang 9

❖ Tập tin văn bản : là kiểu tập tin được lưu trữ các thông tin dưới dạng kiểu ký tự.

▪ Mỗi dòng dài tối đa 255 ký tự và kết thúc bằng ký hiệu cuối dòng (end_of_line)

▪ Truy xuất tập tin văn bản:

o theo từng ký tự

o theo từng dòng

❖ Tập tin nhị phân :

▪ Dữ liệu được đọc và ghi một cách chính xác, không có sự chuyển đổi nào cả

▪ Ký tự kết thúc chuỗi '\0' và end_of_line không có ý nghĩa là cuối chuỗi và cuối

dòng mà được xử lý như mọi ký tự khác

Trang 10

Định vị tập tin

❖ Đường dẫn (path)

▪ Chỉ đến một tập tin không nằm trong thư mục hiện hành Ví dụ:

F:\folder1\file1.txt chỉ tập tin file1.txt nằm trong thư mục folder1 của ổ đĩa F

▪ Trong chương trình, đường dẫn này được ghi trong chuỗi như sau:

"F:\\folder1\\file1.txt"

Trang 11

Qui trình làm việc với FILE

1 Mở tập tin: tạo một stream nối kết với tập tin cần mở, stream được

quản lý bởi biến con trỏ đến cấu trúc FILE

o Cấu trúc được định sẵn trong thư viện stdio.h

o Các thành phần của cấu trúc này được dùng trong các thao tác xử lý tập tin

2 Sử dụng tập tin (sau khi đã mở được tập tin)

o Đọc dữ liệu từ tập tin đưa vào chương trình

o Ghi dữ liệu từ chương trình lên tập tin

3 Đóng tập tin (sau khi sử dụng xong).

Trang 12

Các thao tác cơ bản với file trong C

❖ Khai báo và sử dụng FILE : Kiểu FILE *

Ví dụ: FILE *f, *g; /* Khai báo hai biến con trỏ tập tin*/

▪ Để làm việc với file, chúng ta cần biết vị trí của file (thông qua đường dẫn) để con trỏ kiểu FILE

có thể tạo được luồng dữ liệu giữa người dùng và file trên thiết bị lưu trữ.

Ví dụ: một file văn bản (*.txt) hoặc dạng (*.INP) được lưu trữ như sau

C:\Desktop\my_document.txt

Trong C khai báo con trỏ đến chuỗi ký tự lưu trữ đường dẫn và tên file

const char *filePath = "C:\\Desktop\\my_document.txt"; // con trỏ đén hằng số kiểu chuỗi

#include <iostream>

#include <stdio.h>

using namespace std;

int main() {

const char *filePath = "C:\\Desktop\\my_document.txt"; FILE *fp;

return 0 ; }

Trang 13

❖ Open file (Mở FILE): Để mở một file, các bạn có thể sử dụng hàm fopen

▪ Cú pháp:

▪ Hàm dùng để mở file Nếu thành công hàm cho con trỏ kiểu FILE ứng với file vừa

mở Các hàm liên quan khác sẽ làm việc với file thông qua con trỏ này Nếu có lỗi

Trang 14

Mở FILE

Trang 16

Đóng FILE

❖ Đóng file (close FILE): Sau khi thao tác với file xong, các bạn cần đóng file lại để tránh những lỗi

phát sinh ngoài ý muốn Để đóng file, chúng ta sử dụng hàm fclose:

o fp: là con trỏ được dùng để lưu trữ địa chỉ của đối tượng FILE đang mở Nếu đóng file thành

công thì trả về giá trị 0, ngược lại trả về EOF (End of file)

buffer, đóng file lại, và giải phóng tất cả vùng nhớ mà đối tượng FILE sử dụng.

const char *filePath = "C:\\Desktop\\my_document.txt"; FILE *fp;

Trang 17

❖ Làm sạch vùng đệm - hàm fflush

▪ Cú pháp:

int fflush (FILE *fp);

▪ Dùng làm sạch vùng đệm của tệp fp Nếu lệnh thành công, hàm sẽ cho giá trị 0,

trái lại nó cho hàm EOF

▪ Ví dụ: fflush(fp); // fp là con trỏ FILE

Trang 18

Đọc và ghi dữ liệu (stdio.h)

❖ Thực hiện đọc/ghi dữ liệu theo các cách sau:

o Hàm: fscanf, fprintf

o Chỉ dùng với tập tin kiểu văn bản

o Hàm: getc, fgetc, fgets, putc, fputs

o Chỉ nên dùng với kiểu văn bản

o Hàm: fread, fwrite

o Chỉ dùng với tập tin kiểu nhị phân

Trang 19

Ghi FILE

❖ Ghi dữ liệu vào FILE.

▪ Để mở file cho chế độ ghi file, chúng ta có các mode "w", "w+", "a", "a+"

Ví dụ: Giả sử đọc file và dùng con trỏ fie để quản lý

const char *filePath = "C:\\Desktop\\my_document.txt"; FILE *fp;

fp = fopen(filePath, "wt" ); // ghi file

Trang 20

Ghi FILE

❖ Các hàm cơ bản để ghi FILE

▪ Hàm fputc:

▪ Hàm fputc sẽ ghi ký tự có mã ASCII là biến c vào file được trỏ đến bởi con trỏ fp.

▪ Giá trị trả về là EOF nếu ghi dữ liệu thất bại, trả về mã ASCII của kí tự được ghi vào nếu thực hiện

thành công.

cout << c << endl ;

Trang 21

FILE * fp= fopen(filePath, "wt" ); // dùng con trỏ file fp

fputs( "Hello World" , fp); // ghi chuỗi Hello World vào file my_document.txt

Trang 22

FILE *fp = fopen(filePath, "wt" ); // dùng con trỏ file fp

for (int i = 1; i <= 5 ; i++)

fprintf(fp, "This is an example line %d\n" , i);

int i = 10; int c = 'A'; float f = 7.5;

fprintf(fp, "%d %c %.2f\n", i, c, f);

Lưu ý: Nếu fp là stdout thì hàm giống printf

Trang 23

Ghi FILE

const char *filePath = "C:\\Desktop\\my_document.txt" ;

cout << "File is opened" << endl;

writeToFile(fp); // dinh nghia ham ghi FILE

fclose(fp);

void writeToFile(FILE *file)

{

for (int i = 1 ; i <= 5 ; i++)

fprintf(file, "This is an example line %d\n" , i); }

Trang 24

Đọc FILE

❖ Đọc dữ liệu từ FILE

▪ Để đọc dữ liệu từ file, yêu cầu file đó đã tồn tại và được lưu trữ sẵn Ngược lại sẽ xuất hiện lỗi (file

chưa tồn tại)

▪ Để mở file cho chế độ đọc file, chúng ta có các mode "r", "r+", "a", "a+"

const char *filePath = "C:\\Desktop\\my_document.txt"; // file này đã tồn tại FILE *fp;

fp = fopen(filePath, "rt" ); // che do doc file

if (!fp) // fp == NULL

cout << "Can not open this file" << endl ;

else

cout << "File is opened" << endl ;

// đọc dữ liệu từ file // code here

fclose(fp);

Trang 25

Đọc FILE

❖ Các hàm cơ bản để đọc FILE

▪ Hàm fgetc:

▪ Hàm fgetc đọc ra một kí tự trong file, internal file position indicator sẽ chuyển đến kí tự tiếp theo

Giá trị trả về là mã ASCII của kí tự đã đọc được.

cout << (char)fgetc(fp) << endl;

Trang 26

▪ Chuỗi kí tự đọc được sẽ lưu vào vùng nhớ được quản lý bởi con trỏ buf, nếu đọc dữ liệu thành

công thì trả về địa chỉ của buf, ngược lại trả về NULL.

char* fgets (char *buf, int n, FILE *f);

char buff[255]; // buffer lưu trữ dữ liệu đọc được

cout << fgets(buff, 255, fp) << endl;

cout << buff << endl;

Trang 27

Ví dụ: FILE * fp = fopen(filePath, "rt" ); // dùng con trỏ file fp

fscanf (fp, "%s" , buff);

cout << buff << endl ;

- Chuỗi ký tự Nó sẽ đọc các ký tự liên tiếp nhau tới khi tìm thấy một whitespace (có thể là blank, newline (dòng mới) và tab)

// Xét ví dụ về số

int n;

fscanf (file, "%d" ,&n);

cout << n << endl ;

Trang 28

Đọc FILE

const char *filePath = "C:\\Desktop\\my_document.txt" ; // file đã tồn tại

cout << "File is opened" << endl;

readFromFile(fp); // dinh nghia ham doc FILE

Trang 29

Con trỏ chỉ vị (position indicator)

❑ Khái niệm

▪ Được tạo tự động khi mở tập tin

▪ Xác định nơi diễn ra việc đọc/ghi trong tập tin

❑ Vị trí con trỏ chỉ vị

▪ Khi tập tin chưa mở: ở đầu tập tin (giá trị 0)

▪ Khi mở tập tin:

o Ở cuối tập tin khi mở để chèn (mode a hay a+)

o Ở đầu tập tin (hay giá trị 0) khi mở với các mode khác (w, w+, r, r+)

Trang 30

Truy xuất tuần tự & ngẫu nhiên

❖ Truy xuất tuần tự (sequentially access)

▪ Phải đọc/ghi dữ liệu từ vị trí con trỏ chỉ vị đến vị trí n-1 trước khi đọc dữ liệu tại vị

trí n

▪ Không cần quan tâm đến con trỏ chỉ vị do con trỏ chỉ vị tự động chuyển sang vị trí

kế tiếp sau thao tác đọc/ghi dữ liệu

❖ Truy xuất ngẫu nhiên (random access)

▪ Có thể đọc/ghi tại vị trí bất kỳ trong tập tin mà không cần phải đọc/ghi toàn bộ dữ

liệu trước đó → quan tâm đến con trỏ chỉ vị.

Trang 31

nếu gặp cuối tệp khi đọc, trái

lại hàm cho giá trị 0.

int feof ( FILE * fp )

#include <stdio.h>

#include <iostream>

using namespace std;

int main () {

FILE * fp ;

int c ;

fp = fopen ( “text.txt" , "rt" );

if ( fp == NULL ) { cout << “Khong doc dc file" ;

return 0;

}

while ( 1 ) {

c = fgetc ( fp );

if ( feof(fp) ) {

break ; }

cout << c ; }

fclose ( fp );

return 0 ; }

Giả sử file text.txt chứa nội dung sau

Ky thuat lap trinh hoc ky 2- 2020

Kết quả in chuỗi trong file ra màn hình

Trang 32

▪ Hàm fseek: Chuyển con trỏ chỉ vị trí cần thiết

Cú pháp: int fseek(FILE *fp, long int offset, int origin);

Trong đó:

fp là con trỏ trỏ đến đối tượng FILE đang mở.

offset là số bytes được cộng thêm tính từ vị trí origin.

origin là địa điểm đặt con trỏ trong file.

• Chiều di chuyển là về cuối file nếu offset dương, ngược lại nó sẽ di

chuyển về đầu file.

• Khi thành công, hàm trả về giá trị 0 Khi có lỗi hàm trả về giá trị khác

•SEEK_SET hay 0 : Xuất phát từ đầu tệp.

•SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại của con trỏ chỉ vị.

•SEEK_END hay 2 : Xuất phát từ cuối tệp.

Trang 33

Con Trỏ FILE

❖ Hàm ftell : cho biết vị trí hiện tại của con trỏ FILE.

▪ Hàm cho biết vị trí hiện tại của con trỏ file (byte thứ mấy trên file) khi thành công Số thứ tự tính

từ 0 Trái lại hàm cho giá trị -1L.

Trang 34

Đọc/Ghi FILE

*Note: Dùng fopen trong Visual Studio C++ bị lỗi

Error C4996 'fopen': This function or variable may be unsafe Consider using fopen_s instead To disable deprecation, use

_CRT_SECURE_NO_WARNINGS Khắc phục:

- thêm vào đầu file cpp chứa hàm Main đoạn script sau:

for (int i = 1; i <= 5; i++)

fprintf(file, "This is an example line %d\n", i);

const char *filePath = "F:\\my_document.txt";

FILE *file;

file = fopen(filePath, "w+t");

if (!file) // file == NULL

cout << "Can not open this file" << endl;

Trang 35

Binary FILE (option)

▪ Tập tin nhị phân là một chuỗi các ký tự, không phân biệt ký tự in được hay không in được.

▪ Tập tin nhị phân thường dùng để lưu trữ các cấu trúc (struct) hoặc union

Truy xuất tập tin nhị phân theo khối dữ liệu nhị phân.

“rb” : mở chỉ đọc

“wb” : ghi (ghi đè lên tập tin cũ hoặc tạo mới nếu tập tin không có trên đĩa)

“ab” : ghi nối vào cuối tập tin.

“rb+” : đọc/ghi Tập tin phải có trên đĩa.

“wb+” : tạo mới tập tin cho phép đọc ghi.

“ab+” : đọc, ghi vào cuối tập tin Tạo mới tập tin nếu tập tin chưa có trên đĩa

Trang 36

Binary FILE (option)

▪ Hàm ghi tập tin nhị phân: fwrite ()

Cú pháp : size_t fwrite(const void *ptr, size_t size, size_t count, FILE *f);

▪ Hàm fwrite dùng để ghi dãy bit trong vùng nhớ được quản lý bởi con trỏ ptr vào file đang được trỏ

bởi f, size là số bytes sẽ copy từ vùng nhớ của ptr và count là số lần ghi vùng nhớ đó xuống file.

Ví dụ :

const char *filePath = "C:/Desktop/my_document.txt";

FILE *file;

file = fopen(filePath, "w+b"); //use binary mode

char *s = "Hello everyone!";

fwrite(s, strlen(s), 1, file) // ghi chuỗi s vào file

Trang 37

Binary FILE (option)

▪ Hàm đọc tập tin nhị phân: fread ()

Cú pháp : size_t fread(void *ptr, size_t size, size_t count, FILE *f);

▪ Hàm fread sẽ copy count lần block of bits có kích thước là size, đưa vào vùng nhớ được trỏ đến bởi ptr, từ file

đang được quản lý bởi f.

▪ Sau khi gọi hàm fread,vi trí con trỏ trong file sẽ di chuyển tới (size * count) bytes từ vị trí bắt đầu đọc file.

▪ Nếu có lỗi hoặc EOF thì giá trị trả về nhỏ hơn count.

▪ Hàm fread và fwrite thường được dùng để đọc và ghi dữ liệu kiểu struct vào file.

Ví dụ :

const char *filePath = "C:/Desktop/my_document.txt"; // file đã tồn tại

FILE *file;

file = fopen(filePath, "r+b"); //use binary mode

void *ptr = operator new(255); //allocate 255 bytes on Heap

fread(ptr, 255, 1, file);

(static_cast<char *>(ptr))[255] = '\0';

std::cout << static_cast<char *>(ptr) << std::endl;

Trang 38

FILE và Mảng

▪ Để đơn giản chúng ta chỉ làm việc trên file văn bản (*.txt, *.INP, …)

Dạng 1:

- Dòng đầu tiên chứa thông tin số lượng phần tử của mảng

- Các dòng tiếp theo chứa các phần tử trong mảng

* Lưu ý: mỗi phần tử cách nhau ít nhất một khoảng trắng.

10 -20 4

50 -10 20

Trang 39

10 -20 4

50 -10 20

Trang 40

FILE và Mảng

❖ Đọc ghi FILE cho mảng 1 chiều (dùng dạng 1)

Tạo File input_1.txt có nội dung như sau

Yêu cầu: viết chương trình đọc dữ liệu từ file và lưu trữ trong mảng A

Nhân các giá trị trong mảng A với 2 và sau đó ghi kết quả vào file output_1.txt

Trang 41

// doc dong dau tien trong file

// luu so luong phan tu n

fscanf(file, "%d", &n);

Arr = new int[n]; // cap phat dong

// doc tung phan tu tu file va luu vao mang

for (int i = 0; i < n; i++)

fscanf(file, "%d", &Arr[i]);

}

int main() { // mo file de doc

FILE* fi = fopen("F:\\input_1.txt", "rt");

if (fi == NULL) {

cout << "khong mo dc file";

cout << A[i] << " ";

A[i] = A[i] *2;

} FILE *fo = fopen("F:\\output_1.txt", "wt"); // ghi file writeToFile(fo,A,n);

//dong file fclose(fi); fclose(fo);

delete[] A;

return 0;

}

Trang 42

FILE và Mảng

❖ Đọc ghi FILE cho mảng 2 chiều (dùng dạng 1)

▪ Tạo file input_2.txt có dạng sau

File : output_2.txt

2 3

20 -40 8

100 -20 40

Ngày đăng: 28/04/2022, 06:30

HÌNH ẢNH LIÊN QUAN

stdout Xuất chuẩn Màn hình - Bài giảng kỹ thuật lập trình chương 4 Tập tin (file)
stdout Xuất chuẩn Màn hình (Trang 6)
Kết quả in chuỗi trong file ra màn hình - Bài giảng kỹ thuật lập trình chương 4 Tập tin (file)
t quả in chuỗi trong file ra màn hình (Trang 31)

🧩 Sản phẩm bạn có thể quan tâm

w