Xử lý tập tin
GV. Nguyễn Minh Huy
Nhập mơn lập trình - GV. Nguyễn Minh Huy
1
Nội dung
Thiết bị và stream.
File stream.
Các thao tác trên tập tin.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
2
Nội dung
Thiết bị và stream.
File stream.
Các thao tác trên tập tin.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
3
Thiết bị và stream
Khái niệm thiết bị:
bị:
Dữ liệu Chương trình Kết quả.
quả.
Chương trình lấy dữ liệu từ đâu
đâu?
?
Chương trình xuất kết quả ra đâu
đâu?
?
Thiết bị (device).
Phân loại thiết bị:
bị:
Thiết bị nhập
nhập:: bàn phím
phím,, con chuột,
chuột, tập tin, B
Thiết bị xuất
xuất:: màn hình
hình,, máy in, tập tin, B
Tập tin là thiết bị vừa nhập vừa xuất
xuất..
Nhập mơn lập trình - GV. Nguyễn Minh Huy
4
Thiết bị và stream
Khái niệm stream:
Chương trình đọc/
đọc/ghi dữ liệu từ thiết bị thế nào
nào?
?
Thơng qua những “dịng chảy
chảy”” dữ liệu
liệu..
Stream.
Phân loại stream:
Stream nhập:
nhập: ““dòng
dòng chảy
chảy”” vào chương trình từ thiết bị nhập
nhập..
Stream xuất:
xuất: ““dịng
dịng chảy
chảy”” khỏi chương trình từ thiết bị xuất
xuất..
Nhập mơn lập trình - GV. Nguyễn Minh Huy
5
Thiết bị và stream
Khái niệm stream:
Các stream định nghĩa sẵn trong C:
Stream
Ý nghĩa
Thiết bị kết nối
stdin
Stream nhập chuẩn.
Bàn phím
stdout
Stream xuất chuẩn.
Màn hình
stderr
Stream lỗi chuẩn.
Màn hình
stdprn
Stream in chuẩn
Máy in
Lệnh nhập xuất tổng quát
quát::
fscanf(<Stream>, “<Định
fscanf(
“<Định dạng kiểu
kiểu>”,
>”, &<
&
Biến 1>, B
B));
fprintf((<Stream>, “<Định
fprintf
“<Định dạng xuất
xuất>”,
>”, <
Biến 1>, B
B));
fprintf( stdout
fprintf(
stdout,, “Hello World” );
fprintf(( stdprn
fprintf
stdprn,, “Hello World” );
Nhập mơn lập trình - GV. Nguyễn Minh Huy
// Xuất ra màn hình
hình..
// Xuất ra máy in.
6
Nội dung
Thiết bị và stream.
File stream.
Các thao tác trên tập tin.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
7
File stream
Nhập xuất bằng tập tin:
Ưu điểm
điểm::
Chứa được nhiều dữ liệu
liệu..
Không cần thông qua người dùng
dùng..
Lưu trữ được lâu dài
dài..
Khuyết điểm
điểm::
Tốc độ xử lý chậm
chậm..
Nhập mơn lập trình - GV. Nguyễn Minh Huy
8
File stream
Nhập xuất tập tin trong C:
Dùng file stream.
“Dòng chảy
chảy”” kết nối chương trình và tập tin.
Khai báo
báo:: FILE *<
*<Tên stream>.
FILE *f1;
*f1;
FILE *f2;
*f2;
Các bước xử lý tập tin:
Bước 1: mở tập tin.
Bước 2: thao tác trên tập tin.
Bước 3: đóng tập tin.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
9
File stream
Lệnh mở tập tin:
Thiết lập một file stream đến tập tin.
Cú pháp
pháp:: fopen
fopen((“<
“<Đường
Đường dẫn tập tin>”, “<
“
Chế độ mở
mở>”
>”));
Trả về:
về: file stream ((thành
thành công
công),
), NULL ((thất
thất bại).
bại).
Bảng các chế độ mở tập tin:
Chế độ mở
Ý nghĩa
r
Read-only, mở để đọc dữ liệu (kiểu text).
Trả về NULL nếu khơng tìm thấy tập tin.
w
Write-only, mở để ghi dữ liệu (kiểu text).
Tập tin sẽ được tạo nếu chưa có, ngược lại sẽ ghi đè.
a
Append-only, mở để ghi thêm dữ liệu (kiểu text).
Tập tin sẽ được tạo nếu chưa có.
[Chế độ mở]+
Kết hợp đọc, ghi cùng lúc.
[Chế độ mở]b
Đọc, ghi kiểu nhị phân (binary).
Nhập mơn lập trình - GV. Nguyễn Minh Huy
10
File stream
Lệnh đóng tập tin:
Hủy file stream đến tập tin.
Cú pháp
pháp:: fclose
fclose((<File stream>)
stream>);
Chỉ đóng được tập tin đang mở
mở..
Ln đóng tập tin sau khi kết thúc công việc
việc..
FILE *f = fopen
fopen((“C:
“C:\\\BaiTap.txt”, “r
“r”);
if ( f == NULL )
{
printf(“
printf
(“Khong
Khong mo duoc tap tin!
tin!\\n”);
fclose(( f );
fclose
// Sai.
Sai.
}
else
{
printf(“
printf
(“Da
Da mo duoc tap tin!
tin!\\n”);
fclose(( f );
fclose
// Đúng.
Đúng.
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
11
File stream
Vị trí nhập xuất hiện hành
hành::
Điểm kết nối của File stream vào tập tin.
Nhập xuất luôn bắt đầu từ vị trí hiện hành
hành..
Vị trí hiện hành thay đổi sau mỗi thao tác nhập xuất
xuất..
Chế độ mở
Vị trí nhập xuất hiện hành
r
Đầu tập tin.
w
Đầu tập tin.
a
Cuối tập tin.
[Chế độ mở]+
Tùy thuộc chế độ mở.
[Chế độ mở]b
Tùy thuộc chế độ mở.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
12
File stream
Lệnh thay đổi vị trí hiện hành
hành::
Thay đổi điểm kết nối File stream vào tập tin.
Cú pháp
pháp:: fseek
fseek((<File stream>, <Độ
<Độ dời
dời>,
>, <
Vị trí gốc>
gốc>);
<Vị trí gốc>:
gốc>:
SEEK_SET (đầu
(đầu tập tin).
SEEK_CUR (vị
(vị trí hiện hành
hành).
).
SEEK_END (cuối
(cuối tập tin).
Chỉ thay đổi vị trí hiện hành với tập tin đang mở
mở..
FILE *f = fopen
fopen((“C:
“C:\\\BaiTap.txt”, “r
“r”);
if ( f != NULL )
{
fseek(( f, 2, SEEK_CUR );
fseek
// Tiến tới 2 bytes.
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
13
File stream
Lệnh thơng báo vị trí hiện hành
hành::
Thơng báo vị trí hiện hành so với đầu tập tin.
Cú pháp
pháp:: ftell
ftell((<File stream>)
stream>);
Chỉ thơng báo vị trí hiện hành với tập tin đang mở
mở..
FILE *f = fopen
fopen((“C:
“C:\\\BaiTap.txt”, “r
“r”);
if ( f != NULL )
{
fseek(( f, 0, SEEK_END );
fseek
long filesize = ftell
ftell(( f );
// Lấy kích thước tập tin.
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
14
Nội dung
Thiết bị và stream.
File stream.
Các thao tác trên tập tin.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
15
Các thao tác trên tập tin
Các thao tác cơ bản:
bản:
Đọc dữ liệu
liệu:: theo định dạng
dạng..
Cú pháp
pháp::
fscanf((<File stream>, “<Định
fscanf
“<Định dạng kiểu
kiểu>”,
>”, &<
&
Biến 1>, B
B));
Trả về:
về: số biến đọc được (thành công
công),
), EOF ((thất
thất bại).
bại).
int
a, b;
b;
FILE *f = fopen(“C:
fopen(“C:\\\BaiTap.txt”, “r
“r”);
if ( f == NULL )
printf(“
printf
(“Khong
Khong mo duoc tap tin!
tin!\\n”);
else
{
fscanf(( f, “%d %d”, &a, &b );
fscanf
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
16
Các thao tác trên tập tin
Các thao tác cơ bản:
bản:
Đọc ký tự:
tự:
Cú pháp
pháp:: fgetc
fgetc((<File stream>)
stream>);
Trả về:
về: ký tự (thành công
công),
), EOF ((thất
thất bại).
bại).
Đọc chuỗi
chuỗi::
Cú pháp
pháp:: fgets
fgets((
chuỗi>,
>,
<Số ký tự>,
tự>, <File stream>)
stream>);
Ý nghĩa:
nghĩa: đọc chuỗi đến khi gặp ký tự \n hoặc đủ <Số ký tự>.
tự>.
Trả về:
về: độ dài chuỗi (thành công
công),
), EOF ((thất
thất bại).
bại).
char s[100]
s[100];;
FILE *f = fopen(“C:
fopen(“C:\\\BaiTap.txt”, “r
“r”);
if ( f != NULL )
{
fgets(( s
fgets
s,, 99, f );
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
17
Các thao tác trên tập tin
Các thao tác cơ bản:
bản:
Ghi dữ liệu
liệu:: theo định dạng
dạng..
Cú pháp
pháp::
fprintf((<File stream>, “<Định
fprintf
“<Định dạng kiểu
kiểu>”,
>”, <
Biến 1>, B
B));
Trả về:
về: số byte ghi được (thành công
công),
), EOF ((thất
thất bại).
bại).
int
a = 12;
float b = 4.165;
char c = ‘A’;
FILE *f = fopen(“C:
fopen(“C:\\\BaiTap.txt”, “w
“w”);
if ( f == NULL )
printf(“
printf
(“Khong
Khong tao duoc tap tin!
tin!\\n”);
else
{
fprintf(( f, ““Gia
fprintf
Gia tri = %d %f %c”, a, b, c );
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
18
Các thao tác trên tập tin
Các thao tác cơ bản:
bản:
Đọc dữ liệu
liệu:: theo khối byte (binary).
Cú pháp
pháp::
fread((
fread
nhớ>,
>, <
Kích thước khối
khối>
>,<
Số khối đọc
đọc>,
>, <File stream>
stream>));
Trả về:
về: số khối thật sự đọc được
được..
Kết thúc tập tin khi số khối thật sự < số khối đọc
đọc..
int
a[10];
a[10];
char s[100]
s[100];;
FILE *f = fopen(“C:
fopen(“C:\\\BaiTap.txt”, “rb
“rb”);
”);
if ( f != NULL )
{
fread(( a
fread
a,, sizeof(
sizeof(int),
int), 10, f );
fread(( s
fread
s,, sizeof(char),
sizeof(char), 100, f );
fclose(( f );
fclose
}
Nhập môn lập trình - GV. Nguyễn Minh Huy
// Đọc 10 số nguyên
nguyên..
// Đọc 100 ký tự.
tự.
19
Các thao tác trên tập tin
Các thao tác cơ bản:
bản:
Ghi dữ liệu
liệu:: theo khối byte (binary).
Cú pháp
pháp::
fwrite((
fwrite
nhớ>,
>, <
Kích thước khối
khối>
>,<
Số khối>,
khối>, <File stream>
stream>));
Trả về:
về: số khối thật sự ghi được
được..
int
a[ ] = { 1, 2, 3, 4, 5 };
char s[ ] = “Hello World”;
FILE *f = fopen(“C:
fopen(“C:\\\BaiTap.txt”, “wb
“wb”);
”);
if ( f != NULL )
{
fwrite(( a
fwrite
a,, sizeof(
sizeof(int),
int), 3, f );
// Ghi 3 số nguyên
nguyên..
fwrite(( s
fwrite
s,, sizeof(char),
sizeof(char), strlen(s),
strlen(s), f ); // Ghi chuỗi s.
fclose(( f );
fclose
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
20