Tậ
Tập ti
tin Nhị phân
hâ
Cá chế
Các
hế độ mở
ở tập
tậ tin
ti nhị
hị phân
phân:
hâ :
“rb” : mở chỉ đọc
“wb”
“ b” : ghi
hi (ghi
( hi đè lên
lê tập
tậ tin
ti cũũ hoặc
h ặ tạo
t mới
ới nếu
ế tập
tậ
tin khơng có trên đĩa)
“ab”
ab
: ghi nối vào cuối tập tin
tin..
“rb+”
: đọc/ghi
đọc/ghi.. Tập tin phải có trên đĩa
đĩa..
“wb+”
“ b+” : tạo mới tập tin cho phép đọc ghi
ghi..
“ab+” : đọc, ghi vào cuối tập tin
tin.. Tạo mới tập tin nếu
tập tin chưa có trên đĩa
đĩa..
Đ ghi
Đọc
hi tập
tậ ti
tin Nhị phân
hâ
fread() : đọc
fread()
size_t fread ( void *Ptr
*Ptr,, size_t ItemSize
ItemSize,,
size_t NumItem
NumItem,, FILE * fp );
fread đọc NumItem khối dữ liệu
liệu,, mỗi khối có kích thước
ItemSize từ fpp và chứa vào vùngg nhớ xác định
ị bởi Ptr.
Ptr.
fread trả về số khối dữ liệu đọc được
được..
Nếu có lỗi hoặc EOF thì giá trị trả về nhỏ hơn NumItem
fwrite() : ghi
fwrite()
size_t
i t fwrite
f it ( constt void
id *Ptr
**Pt
Pt , size_t
Ptr,
i t ItemSize
It Si ,
ItemSize,
size_t NumItem
NumItem,, FILE * fp );
fwrite ghi khối (NumItem x ItemSize)
ItemSize) xác dịnh bởi Ptr ra fp.
Chép 3 mục từ tập tin filename vào vùng nhớ trỏ bởi ptr
ptr
fpỈ
fp
Ỉfilename
Con
C ttrỏ
ỏ FILE
Một tập
tậ tin
ti sau khi mở
ở được
đ
quản
ả lý thông
thô qua một
ột con trỏ
tỏ
FILE..
FILE
Khi mở tập tin (wb, rb), con trỏ FILE chỉ đến đầu tập tin.
tin.
Khi mở tập tin (ab), con trỏ FILE chỉ đến cuối tập tin
tin..
Con trỏ FILE chỉ đến từng byte trong tập tin nhị phân
phân..
Sau mỗi lần đọc tập tin, con trỏ FILE sẽ di chuyển đi một
số byte bằng kích thước (byte) của khối dữ liệu đọc được
được..
fseek(),
fseek
(),
Các hằng dùng trong di chuyển con trỏ FILE
#define
SEEK SET 0
SEEK_SET
#define
SEEK_CUR 1
#define
SEEK_END 2
int fseek(
fseek( FILE *fp
*fp,, long int offset, int whence );
fseek di chuyển con trỏ fp đến vị trí offset theo mốc whence
offset: khoảng cách (byte) cần di chuyển tính từ vị trí hiện tại
tại..
(offset > 0: đi vềề phía cuối
ố tập tin, offset < 0: ngược vềề đầu
ầ tập
tin)
whence:
SEEK SET: tính từ đầu tập tin
SEEK_SET:
SEEK_CUR: tính từ vị trí hiện hành của con trỏ
SEEK_END: tính từ cuối tập tin
fseek trả về
về:: 0 nếu thành công
công,, <>0 nếu di chuyển có lỗi
ft
ftell
ftell()
ll() và
ll()
à rewind()
i d()
rewind
i d đặt lại
l i vịị trí
t í con trỏ
t ỏ vềề đầu
đầ tập
tậ tin.
ti
void rewind ( FILE * fp );
tương đương với fseek ( fp
fp,, 0L, SEEK_SET);
ftell trả về vị trí offset hiện tại của con trỏ
long int ftell ( FILE * fp );
Nếu có lỗi,
lỗi, ftell trả về -1L
Ví d
dụ: xác
á định
đị h kí
kích
h thước
h ớ tập
ậ tin.
i
...//
// khai
kh i báo
bá biến
biế cNn
N thận
thậ
1.
if ( fp
f = fopen
f
( FileN
Fil N ame,
ame, “rb
“rb”
b” ) ) == N ULL )
fprintf(( stderr,
fprintf
stderr, “Cannot open %s
%s\\n”, FileN ame );
else
l
{
f k(
fseek(
fseek
k( fp
f , 0, SEEK_ENN D );
fp,
)
FileSize = ftell
ftell(( fp );
printf(( “File size : %d bytes
printf
bytes\\n “, FileSize );
fclose(( fp );
fclose
}
2.
3.
4.
5.
6.
7.
8.
9.
Vịị trí con trỏ
trỏ:: fgetpos()
fgetpos
g p () và
fsetpos()
etpos()
với các tập tin có kích thước cực lớn fseek và ftell sẽ bị
giới hạn bời kích thước của offset.
Dùng
int fgetpos ( FILE **fp
fp,, fpos_t *position);
int fsetpos ( FILE **fp
fp,, const fpos_t *position);
Xó và
Xóa
à đổi tên
tê tập
tậ tin
ti
Th hiện
Thực
hiệ xốá
int remove(const char *filename);
filename);
đổi tên tập tin
int rename(const char *oldname
*oldname,, const char **newname
newname);
);
Chú ý khi làm
là việc
iệ với
ới tập
tậ tin
ti
Khi mở
ở tập
tậ tin
ti filename,
fil
tậ tin
tập
ti này
à phải
hải nằm
ằ cùng
ù thư
th
mục của chương trình hoặc
phải cung cấp đầy đủ đường dẫn đến tập tin
vd: C:
vd:
C:\\baitap\
baitap\taptin.dat
viết như thế nào
nào??
fp = fopen
fopen(( “C:\
“C:\baitap\
baitap\taptin.dat”, ““rb
rb”” );
SAI RỒI
vìì cóó ký tự
t đặc
đặ biệt ‘\’ nên
ê viết
iết đúng
đú sẽẽ là
là::
fp = fopen
fopen(( “C:\
“C:\\baitap
baitap\\\taptin.dat”, ““rb
rb”” );
Tham số dịng lệnh chương trình
Khi gọi chạy một chương trình
trình,, chúng ta có thể cung cấp các
tham sốố tại dịng lệnh gọi chương trình
trình..
ví dụ:
dụ: dir A:\
A:\*.c /w
“copy”
copy , “A:\
“A:
A:\*.c
A:\
* c” và “/w”
/w là hai tham số điều khiển chương
trình..
trình
command--line arguments.
command
arguments
Các tham số dịng lệnh được tham chiếu qua hai đối số khai
báo trong hàm main.
main ( int argc,
argc
g , char * argv
argv[
g [])
{ ... }
argc: argument count
argc:
argv:: argument vector
argv
Th
Tham sốố dịng
dị lệ
lệnh
h – víí dụ
d
1.
2.
3.
4
4.
5.
6
6.
7.
8
8.
... // addint.c Ỉ addint.exe
void main ((int
int argc,
argc, char * argv [ ])
{
int res = 0;
printf ((“ Program %s\
%s\n “, argv
argv[0]);
[0]);
for ( int i = 1; i < argc
argc;; i++ )
res +
+= atoi
atoi((argc
argc[[i]);
printf (“ %d
%d\\n”, res );
}
G:\>addint 3 –2 1 5 6 -2 1
G:\
12
Đệ quy - Recursion
Phạm Thế Bảo
Trường Đại học Khoa học Tự nhiên Tp.HCM
Tp HCM
Thuật
ậ toán đệệ quy
q y
Là mở rộng cơ bản nhất của khái niệm thuật toán.
toán.
Tư tưởng giải bài toán bằng đệ quy là đưa bài toán
hiện tại về một bài tốn cùng loại, cùng tính chất
(đồng dạng) nhưng ở cấp độ thấp hơn
hơn,, quá trình này
tiếp tục cho đến khi bài tốn được đưa về một cấp độ
mà tại đó có thể giải được
được.. Từ cấp độ này ta lần ngược
để giải các bài toán ở cấp độ cao hơn cho đến khi giải
xong bài tốn ban đầu
đầu..
Ví dụ:
dụ:
định
nghĩa giai thừa:
thừa: n!=n*(nn!=n*(n-1)! với 0!=
!=1
1
Dãy Fibonacci
Fibonacci:: f0=1, f1=1 và fn =fn-1+fn-2 ∀n>
n>11
Danh sách liên kết.
kết
ế.
...
Phạm Thế Bảo
Mọi thuật toán đệ quy gồm 02 phần
phần::
Phần cơ sở
sở::
Là các trường hợp không cần thực hiện lại thuật tốn (khơng
yu cầu ggọi đệ qquy)
quy).
y). Nếu thuật tốn đệ qquyy khơngg có pphần
này thì sẽ bị lặp vơ hạn và sinh lỗi khi thực hiện.
hiện. Đôi lúc gọi
là trường hợp dừng
dừng..
Phần
ầ đệ quy
quy::
Là phần trong thuật tốn có yêu cầu gọi đệ quy, yêu cầu
thực
h hiện
hiệ thuật
h ậ toán
á ở một
ộ cấp
ấ độ thấp
hấ hơn
h .
hơn.
Phạm Thế Bảo
Các loại
ạ đệệ quy
q y
Có 03 loại đệ quy
quy::
1. Đệ quy đuôi
đđuôi:
i:
Là loại đệ quy mà trong một cấp đệ quy chỉ có duy nhất
một
ột lời gọii đệ quy xuống
ố cấp
ấ thấp
thấ .
thấp.
Ví dụ
dụ::
i.
Tính
í h giai
i i thừa
hừ
giaiThua(int n){
if(n==0
if(n==
0)
giaiThua = 1;
else giaiThua= n*giaiThua(nn*giaiThua(n-1);
}
Phạm Thế Bảo