Nếu nó đến cuối tệp thì hàm trả về giá trị khác 0 , ngược lại trả về 0 int ferrorFILE *stream; Kiểm tra lỗi thao tác trên tệp.. Nếu việc mở tệp thành công hàm cho địa chỉ con trỏ tệp , t
Trang 2void clearerr(FILE *stream);
Xoá tín hiệu lỗi gây ra bởi hệ thống khi thao tác trên tập tin gặp lỗi
Trang 3/* mo tep tin de ghi */
/* xuat ra man hinh thong bao loi */
printf("Error reading from DUMMY.FIL\n");
/* xoa tin hieu loi */
int fclose(FILE *stream);
Đóng tệp lại sau khi thao tác , stream là tên con trỏ tệp Khi thành công hàm trả về 0 , trái lại trả về EOF ( hằng chỉ thị kết thúc tệp )
Trang 4int feof(FILE *stream);
Hàm dùng để kiểm tra con trỏ tệp có đến cuối tệp hay chưa Nếu nó đến cuối tệp thì hàm trả về giá trị khác 0 , ngược lại trả về 0
int ferror(FILE *stream);
Kiểm tra lỗi thao tác trên tệp Hàm trả về giá trị khác 0 nếu có lỗi , ngược lại trả về 0
/* ghi loi ra man hinh*/
printf("Error reading from DUMMY.FIL\n");
Trang 5/* xoa tin hieu loi*/
int fflush(FILE *stream);
Hàm dùng làm sạch vùng đệm của tệp Nếu thành công hàm cho giá trị 0 , trái lại hàm trả về EOF
/*ghi mot vai du lieu len tep */
fwrite(msg, strlen(msg), 1, stream);
Trang 6int fgetc(FILE *stream);
Hàm dùng lấy 1 ký tự từ tệp do con trỏ tệp stream trỏ đến Nếu thành công hàm trả về mã ASCII của ký tự đọc được Nếu gặp lỗi hay gặp kết thúc tệp thì hàm trả về EOF
/* ghi len tep mot chuoi */
fwrite(string, strlen(string), 1, stream);
/* dat con tro tep len dau tep */
Trang 7int fgetpos( FILE *stream,fpos_t *pos )
Hàm dùng lấy vị trí con trỏ tệp ( ở byte thứ mấy ) lưu vào trong biến pos Nếu thành công hàm trả về 0 , ngược lại hàm trả về giá trị khác 0
/* ghi du lieu len tep */
fprintf(stream, "This is a test");
/* in ra man hinh vi tri con tro hien thoi */
Trang 8char *fgets(char *s,int n,FILE *fp);
Hàm dùng để đọc một chuỗi ký tự dài n-1 ký tự từ tệp fp vào chuỗi s Việc đọc kết thúc khi đã đọc đủ n-1 ký tự hay gặp dấu xuống dòng hay gặp kết thúc tệp Sau khi đọc , chuỗi s sẽ được
tự động thêm vào ký tự NULL vào cuối chuỗi Hàm trả về điạ chỉ chuỗi s nếu thành công , trái lại trả về NULL
/* ghi mot chuoi vao tep */
fwrite(string, strlen(string), 1, stream);
/* dat con tro tep len dau tep */
fseek(stream, 0, SEEK_SET);
/* doc mot chuoi tu tep */
fgets(msg, strlen(string)+1, stream);
/* in chuoi ra man hinh */
FILE *fopen(char *filename,char *type );
Hàm dùng để mở tệp Với filename là chuỗi chứa tên tệp cần mở ( bao gồm cả đường dẫn cụ thể ) Lưu ý một chút với filename này Nếu bạn nhập chuỗi từ bàn phím thì khác với bạn đánh sẵn nó trong code của bạn Ví dụ tệp ta cần mở tên là abc.jpg nằm ở ổ C Đối với đánh tên tệp
từ bàn phím thì ta đánh như sau : C:\abc.jpg Nhưng nếu ta soạn sẵn trong code thì ta soạn như sau : C:\\abc.jpg ( tức là thêm 1 gạch \ )
Kiểu mở tệp có rất nhiều cách nhưng chung quy ta có các trường hợp sau cho kiểu văn bản :
"r" : đọc
"w" : ghi
"r+" hay "w+" : đọc và ghi
"a" : ghi bổ sung
"a+" : đọc ghi bổ sung
Trang 9Đối với mở file nhị phân bạn chỉ cần thêm chữ b vào sau các chuỗi trên
Nếu việc mở tệp thành công hàm cho địa chỉ con trỏ tệp , trái lại hàm trả về NULL
int fprintf(FILE *fp,char *s, );
Hàm này chức năng y chang như hàm printf nhưng thay vì ghi ra màn hình thì nó ghi lên tệp fp Nếu thành công hàm trả về số byte ghi được lên tệp , trái lại hàm trả về EOF
Trang 10/* mo tep de doc ghi */
int fputc(int ch,FILE *fp);
Hàm ghi một ký tự có mã ASCII là ch lên tệp fp khi thành công trả về mã ASCII của
ký tự được ghi , trái lại hàm cho EOF
int fputs(char *s,FILE *fp);
Hàm ghi lên tệp fp chuỗi s Chú ý rằng chuỗi s nên kết thúc bằng ký tự NULL , nếu ko việc ghi lên có thể bị sai lệch Ký tự NULL này để chỉ ra vị trí kết thúc tệp cho rõ ràng chứ nó ko được ghi lên tệp Hàm trả về ký tự cuối cùng được ghi lên tệp nếu thành công , trái lại hàm cho EOF
Example
Code:
Trang 11#include <stdio.h>
int main(void)
{
/* ghi mot chuoi ra dong xuat chuan ( man hinh ) */
fputs("Hello world\n", stdout);
int fread(void *ptr,int size,int n,FILE *fp);
Hàm đọc n mẫu tin , mỗi mẫu có kích thước size từ tệp fp lưu vào trong vùng nhớ ptr Hàm trả
về một giá trị bằng số mẫu tin thực sự đọc được Nếu gặp lỗi hay gặp kết thúc tệp hàm trả về 0
/* ghi du lieu len tep */
fwrite(msg, strlen(msg)+1, 1, stream);
/* dat con tro tep len dau tep */
fseek(stream, SEEK_SET, 0);
/* doc du lieu tu tep va xuat ra man hinh */
fread(buf, strlen(msg)+1, 1, stream);
printf("%s\n", buf);
fclose(stream);
return 0;
}
Trang 12Hàm freopen
Khai báo :
Trích dẫn:
FILE *freopen(char *filename,char *type,FILE *fp);
Hàm này có chức năng gán con trỏ tệp fp vào tệp filename Sau đó có thể mở đọc ghi trên tệp này thông qua con trỏ tệp fp Hàm này đặc biệt có ích khi ta muốn gán các con trỏ tệp chuẩn ( stdin , stdout , stderr ) vào 1 tệp của ta Hàm trả về NULL nếu gặp lỗi
fprintf(stderr, "error redirecting stdout\n");
/* khi do cau lenh nay se khong con xuat ra man hinh nua ma xuat vao tep output.fil */
printf("This will go into a file.");
/*dong tep stdout lai */
int fscanf(FILE *fp,char *s, );
Hàm có chức năng đọc dữ liệu từ tệp Làm việc giống như hàm scanf nhưng thay vì đọc từ màn hình thì hàm fscanf đọc từ tệp thôi Hàm trả về 1 giá trị bằng số trường đọc được
Trang 13int fseek(FILE *fp,long sb,int xp);
Hàm dùng di chuyển con trỏ tệp fp đến vị trí bất kỳ Với sb là số byte cần di chuyển , xp là vị trí xuất phát Nếu sb dương tức là di chuyển về cuối tệp , nếu âm thì di chuyển về đầu tệp Nếu xp
là 0 hay SEEK_SET tức là xuất phát từ đầu tệp , nếu là SEEK_CUR hay 1 tức là xuất phát tại vị trí hiện thời của con trỏ tệp , nếu là SEEK_END hay 2 tức là xuất phát tại cuối tệp
fprintf(stream, "This is a test");
printf("Filesize of MYFILE.TXT is %ld bytes\n",
Trang 14Hàm fsetpos
Khai báo :
Trích dẫn:
int fsetpos(FILE *stream , fpos_t pos);
Hàm này thường đi kèm cùng hàm fgetpos Hàm dùng để di chuyển con trỏ tệp đến vị trí đươc lưu trong con trỏ pos Vị trí này do hàm fgetpos lưu lại từ trước Hàm trả về 0 nếu thành công , ngược lại trả về giá trị khác 0
/* ghi du lieu len tep */
fprintf(stream, "This is a test");
/* in ra man hinh vi tri con tro hien thoi */
Trang 15Khi thành công hàm cho viết vị trí con trỏ tệp hiện thời đang ở vị trí thứ mấy ( tính từ đầu tệp ) ,
số hiệu của byte tính từ 0 Ngược lại hàm trả về -1L Nói thêm 1 tí về -1L có nghĩa là -1 mà lưu dưới dạng long ( dùng 4 byte để lưu )
fprintf(stream, "This is a test");
printf("The file pointer is at byte %ld\n",
int fwrite( void *ptr,int size,int n,FILE *fp );
Hàm dùng để ghi n mẫu tin kích thước size byte từ vùng nhớ ptr lên tệp fp Hàm trả về 1 giá trị bằng số mẫu tin thực sự đọc được
Trang 16if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* mo tep TEST.$$$
2 String & Character
Danh sách các hàm với String & Character
Trang 18#include <stdlib.h>
double atof( const char *str );
Chuỗi 'str' phải bắt đầu bằng kí tự số, nếu không sẽ bị lỗi chương trình (termination)
char *strB="17.3 thu xem dc khong?";
char *strC="Cai nay chac co loi 33.4";
double a, , ;
a = atof(strA);
b = atof(strB);
//c = atof(strC); < - Dong nay convert se bi loi
printf("\nGia tri cua chuoi %s sau khi convert la %.2f",strA, ); printf("\nGia tri cua chuoi %s sau khi convert la %.2f",strB, ); //printf("\nGia tri cua chuoi %s sau khi convert la %.2f",strC,c); < - bo comment ra se co loi
int atoi( const char *str );
'str' phải bắt đầu bằng số hoặc kí tự trắng <space> nếu không convert sẽ fail và trả về 0
Code minh họa
Trang 19i = atoi( " 512 bottles of beer on the wall" );
printf("\nGia tri cua i la: %d", );
// Truong hop duoi day se in ra 0
printf("\nGia tri cua i la: %d", );
long atol( const char *str );
Tương tự như atoi()
printf("\nGia tri cua i la: %d", );
printf("\nGia tri cua i la: %d", );
// Truong hop duoi day se in ra 0
printf("\nGia tri cua i la: %d", );
int isalnum( int ch );
Kiểm tra một kí tự là số hay chữ cái
Trang 20int main(void)
int isalpha( int ch );
Kiểm tra một kí tự có phải là chữ cái hay không
int iscntrl( int ch );
Kiểm tra một kí tự có thuộc nhóm kí tự điều khiển hay không
Nhóm kí tự điều khiển (Control Character) nằm từ : 0x00 đến 0x1F và kí tự 0x7F
Đúng thì trả về khác 0
Sai thì trả về 0
Trang 22PHP Code:
#include <ctype.h>
int isdigit( int ch );
Kiểm tra 1 kí tự có phải là kí tự số hay không
int isgraph( int ch );
Bất cứ kí tự nào có thể in ra được (printable character) đều gọi là Graphical Character, ngoại trừ
Trang 23Tên hàm: islower()
Định nghĩa
PHP Code:
#include <ctype.h>
int islower( int ch );
Kiểm tra một kí tự xem có phải chữ in thường không
int isprint( int ch );
Printable character bao gồm Graphical Character và kí tự trắng <space>
kiểm tra 1 kí tự có phải là printable character hay không
Trang 24Tên hàm: ispunct()
Định nghĩa:
PHP Code:
#include <ctype.h>
int ispunct( int ch );
Punctuation Character là các kí tự trong nhóm Graphical Character nhưng không phải là chữ cái hay số
int isspace( int ch );
Space Character là những kí tự tạo nên khoảng trắng (line feed, form feed )
Trang 25int isupper( int ch );
Kiểm tra một kí tự có phải chữ in Hoa hay không
int isxdigit( int ch );
Kiểm tra xem một kí tự có phải là số ở hệ thập lục (Hex - 16) hay không
Trang 26Tên hàm: memchr()
Định nghĩa:
PHP Code:
#include <string.h>
void *memchr( const void *buffer, int ch, size_t count );
Tìm vị trí xuất hiện đầu tiên của kí tự 'ch' trong buffer của một chuỗi 'buffer' trong khoảng kí tự giới hạn 'count' cho trước
Nếu tìm thấy thì trả về vị trí kí tự xuất hiện trong chuỗi 'buffer'
Ngược lại NULL trả về
int memcmp( const void *buffer1, const void *buffer2, size_t count );
So sánh 'count' kí tự đầu tiên của 2 chuỗi buffer1 và buffer2
char buffer1[]="Xcross87 is a chick of programming";
char buffer2[]="Xcross87 is a crazy";
Trang 27int compare_result = memcmp(buffer1,buffer2,strlen(buffer2));
void *memcpy( void *to, const void *from, size_t count );
Copy 'count' kí tự từ 'from' sang 'to'
memcpy(to,from,strlen(from)+1);
printf(" Gia tri cua \'to\' sau khi copy la: %s ",to);
void *memmove( void *to, const void *from, size_t count );
Giống hàm memcpy() nhưng xử lý được tình huống overlap với from và to
Chú ý: nên sử dụng memmove() thay vì sử dụng memcpy()
PHP Code:
Trang 28memmove(to,from,strlen(from));
printf("\n Gia tri cua \'to\' sau khi move la: %s ",to);
void* memset( void* buffer, int ch, size_t count );
Lấp đầy 'count' bytes đầu tiên trong 'buffer' với kí tự 'ch'
Hàm chuyên sử dụng để lấp đầy hoặc khởi tạo memory block hay array, tốc độ xử lý tốt hơn vòng lặp
Trang 29char *strchr( const char *str, int ch );
Hàm trả về giá trị chuỗi bắt đầu với 'ch' trong chuỗi 'str' Trả về NULL nếu không tìm thấy gì hết
ví dụ dưới đây sẽ cho ra kết quả là : 'ss87'
Trang 30const char *str1="Xcross87 ";
const char *str2="Xcross";
char *strcpy( char *to, const char *from );
Copy từ chuỗi 'from' sang chuỗi 'to'
Chú ý: hàm dễ xảy ra buffer overflow
Trang 31size_t strcspn( const char *str1, const char *str2 );
Trả về vị trí đầu tiên của bất cứ kí tự nào trong 'str1' tìm thấy trong 'str2'
Nếu không tìm thấy thì trả về độ dài chuỗi str1
int pos = strcspn(str,key);
printf("tim thay o vi tri %d",pos);
char *strerror( int num );
Lấy chuỗi error báo lỗi tương ứng của lỗi tìm được
Ví dụ dưới đây minh họa báo lỗi không tìm thấy file
Trang 32size_t strlen( char *str );
Hàm trả về độ dài của chuỗi
const char *str="congdongcviet.com";
printf("do dai chuoi la: %d",strlen(str));
char *strncat( char *str1, const char *str2, size_t count );
Nối chuôi cơ ban như hàm strcat() nhưng chỉ định số byte của chuỗi str2 để nối vào str1
const char *str1="con ga";
const char *str2=" xcross87 is crazy";
char *result;
result = strncat(str1,str2, );
Trang 33printf("Chuoi sau khi noi: %s",result);
int strncmp( const char *str1, const char *str2, size_t count );
Giống hàm strcmp() nhưng chỉ so sánh 'count' bytes cho trước
char *strncpy( char *to, const char *from, size_t count );
Copy từ from vào to với số byte quy định
char* strpbrk( const char* str1, const char* str2 );
trả về kí tự xuất hiện đầu tiên trong 'str1' xuất hiện trong 'str2'
Trả về NULL nếu không tìm thấy
const char *str1="con ga trong ko phai la con ga mai";
const char *str2="zzzzzzzzzzzza";
Trang 34char* strpbrk( const char* str1, const char* str2 );
trả về kí tự xuất hiện đầu tiên trong 'str1' xuất hiện trong 'str2'
Trả về NULL nếu không tìm thấy
const char *str1="con ga trong ko phai la con ga mai";
const char *str2="zzzzzzzzzzzza";
char *strrchr( const char *str, int ch );
Trả về sự xuất hiện cuối cùng của kí tự 'ch' trong chuỗi 'str'
size_t strspn( const char *str1, const char *str2 );
trả về con trỏ tới vị trí đầu tiên của str2 trong str1 nếu tìm thấy
trả về NULL nếu không thấy
nếu độ dài của str2 là 0 thì trả về độ dài của str1
Trang 35{
const char *str1="con ga trong ko phai la con ga mai";
const char *str2="la";
char* result;
result = strstr(str1,str2);
if(NULL != result) {
printf(" Doan tim thay: %s", result);
double strtod( const char *start, char **end );
start là chuỗi đầu vào của convert; end là phần còn lại của chuỗi sau khi convert
convert thành công thì trả về số double đã convert
result = strtod(start,&end);
printf("Sau khi convert: ");
printf("\n start = %s ",start);
printf("\n end = %s ",end);
printf("\n result = %lf",result);
Trang 36#include <string.h>
char *strtok( char *str1, const char *str2 );
trả về chuỗi đầu tiên được cưa ra trong str1 theo khóa str2
nếu không tìm thấy thì trả về NULL
sau khi kết thúc toàn bộ token trong str1 thì str1=NULL
long strtol( const char *start, char **end, int base );
tương tự strtod() nhưng chuỗi vào start có base cho trước để convert sang
unsigned long strtoul( const char *start, char **end, int base );
giống như strtol() nhưng cho kiểu unsigned long
Trang 37size_t strxfrm( char *str1, const char *str2, size_t num );
copy 'num' bytes từ str2 sang str1
int tolower( int ch );
convert sang kí tự thường
int toupper( int ch );
convert kí tự sang kí tự hoa
Trang 39int abs( int num );
trả về giá trị tuyệt đối của 1 số
double acos( double arg );
trả về giá trị arc cosine của 'arg' trong khoảng [0,PI], arg nằm trong khoảng [-1,1] Nếu arg ngoài giới hạn cho phép thì acos() trả về giá trị NAN
double asin( double arg );
hàm trả về arc sine của arg
Trang 40double atan( double arg );
Hàm trả về arc tangent của một số
double atan2( double y, double x );
trả về arc tangent của y/x